Python asyncore 与 dbus

6 投票
3 回答
784 浏览
提问于 2025-04-15 18:33

有没有办法把 asyncoredbus 放在同一个 main loop 里一起用呢?

通常,DBus 是通过 glib 的主循环来集成的:那么,是不是可以让 asyncore 来整合这个主循环,或者 让 dbus 使用 asyncore 的主循环呢?

3 个回答

0

虽然你得到了一个看起来很合理的答案,但还有另一种方法——其实你不一定非得用asyncore的循环。你可以直接调用asyncore.loop,设置超时时间为零,循环次数为1,这样就会停止继续循环(这也让函数名有点误导),只会检查一次socket的状态。你可以根据需要多次调用这个方法。

我对glib的异步支持不了解,但如果它需要使用线程的话,使用这种方式的asyncore可能会让你获得更好的性能,因为它会使用select或poll,而不需要额外创建线程。

1

我为自己一个叫做 项目 写了一个简单的 GSource 包装器,名字叫 AsyncoreGSource

只需要把它 附加 到合适的 MainContext 上就可以了:

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

当然,默认情况下使用的是 asyncore.socket_map 和默认的 MainContext

你也可以尝试 修改 asyncore.socket_map,如果我没有查看 GLib 的 Python 绑定源代码,这本来会是我的解决方案。

7

asyncore不好用。其实,glib已经提供了异步处理的功能,所以直接用glib的主循环来完成所有事情就可以了。

撰写回答