Python异步和dbus

Posted

技术标签:

【中文标题】Python异步和dbus【英文标题】:Python asyncore & dbus 【发布时间】:2011-01-10 02:22:14 【问题描述】:

是否可以通过相同的main loopasyncoredbus 集成?

通常,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的主要内容,如果未能解决你的问题,请参考以下文章

如何为两个单独的 Dbus Python 程序创建 Dbus Mainloop

DBus Finch/Pidgin 不带 X11

python异步(Async)编程

Python高级编程和异步IO并发编程

一文教你Python Web异步框架

python协程和异步IO——IO多路复用