Python异步和dbus
Posted
技术标签:
【中文标题】Python异步和dbus【英文标题】:Python asyncore & dbus 【发布时间】:2011-01-10 02:22:14 【问题描述】:是否可以通过相同的main loop
将asyncore
与dbus
集成?
通常,DBus 集成是通过glib
主循环完成的:是否可以让asyncore
集成这个主循环或让 dbus 使用asyncore
的?
【问题讨论】:
当你有 glib 的时候为什么要使用 asyncore? glib 似乎更有能力...... 【参考方案1】:asyncore
糟透了。 glib
已经提供了异步的东西,所以只需使用 glib
的主循环来做所有事情。
【讨论】:
【参考方案2】:我为my own projects 之一写了一个简单的GSource
包装器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
,这将是我的解决方案。
【讨论】:
请注意,我已经遇到了一些性能问题,并且有一个与 Linux(但不是 Windows)上的 GLib 轮询接口完全集成的版本。待事情稳定后,我会更新这个答案。【参考方案3】:虽然您得到的答案可能是完全合理的,但还有另一种方法 - 您不需要使用 asyncore 本身的循环。只需使用零超时和 1 计数调用 asyncore.loop,这将停止它的迭代(从而使函数名称完全具有误导性)并且只轮询一次套接字。根据需要随时调用。
我对 glib 的异步支持一无所知,但如果它需要线程,您可能仍然可以通过以这种方式使用 asyncore 获得更好的性能,因为它将使用 select 或 poll 并且不需要产生额外的线程。
【讨论】:
感谢您的想法 - 我已经为这个项目选择了 Twisted。以上是关于Python异步和dbus的主要内容,如果未能解决你的问题,请参考以下文章