Python asyncore 与 dbus
有没有办法把 asyncore
和 dbus
放在同一个 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
的主循环来完成所有事情就可以了。