2010-01-27 55 views
5

是否有可能通过相同的main loopasyncoredbus集成?Python asyncore&dbus

通常的DBus整合是通过glib主循环中完成:是有可能有两种asyncore整合这个主循环有DBUS使用asyncore的?

+0

为什么当你有glib时使用asyncore? glib似乎更有能力... – 2010-01-27 18:31:11

回答

7

asyncore很烂。 glib已经提供了异步的东西,所以只需使用glib的主循环来完成任何事情。

0

虽然你有可能是一个完全合理的答案,还有另一种方法 - 你不需要使用asyncore循环本身。只需调用asyncore.loop一个零超时和计数为1,这将停止它迭代(并因此使函数名称完全误导)并轮询套接字一次。根据需要随时调用。

我对glib的异步支持一无所知,但如果它需要线程,通过以这种方式使用asyncore可能仍然会获得更好的性能,因为它将使用select或poll并且不需要产生其他线程。

+1

感谢您的想法 - 我已经解决了Twisted这个项目。 – jldupont 2010-01-28 14:21:23

1

我写了一个简单的GSource包装的所谓的my own projects一个AsyncoreGSource

只是attach它适当的MainContext

source = AsyncoreGSource([socket_map]) 
source.attach([main_context]) 

自然的默认值是asyncore.socket_map和分别为default MainContext

您也可以尝试monkey-patching asyncore.socket_map,如果我没有戳GLib python bindings source code for GSource,本来应该是我的解决方案。

+0

请注意,我已经遇到了一些性能问题,并且有一个完全与Linux上的GLib轮询界面集成的版本(但不是Windows)。当事情稳定下来,我会更新这个答案。 – 2011-01-15 17:37:12