【发布时间】:2011-01-10 02:22:14
【问题描述】:
是否可以通过相同的main loop 将asyncore 与dbus 集成?
通常,DBus 集成是通过glib 主循环完成的:是否可以让asyncore 集成这个主循环或让 dbus 使用asyncore 的?
【问题讨论】:
-
当你有 glib 的时候为什么要使用 asyncore? glib 似乎更有能力......
是否可以通过相同的main loop 将asyncore 与dbus 集成?
通常,DBus 集成是通过glib 主循环完成的:是否可以让asyncore 集成这个主循环或让 dbus 使用asyncore 的?
【问题讨论】:
asyncore 糟透了。 glib 已经提供了异步的东西,所以只需使用 glib 的主循环来做所有事情。
【讨论】:
我为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,这将是我的解决方案。
【讨论】:
虽然您得到的答案可能是完全合理的,但还有另一种方法 - 您不需要使用 asyncore 本身的循环。只需使用零超时和 1 计数调用 asyncore.loop,这将停止它的迭代(从而使函数名称完全具有误导性)并且只轮询一次套接字。根据需要随时调用。
我对 glib 的异步支持一无所知,但如果它需要线程,您可能仍然可以通过以这种方式使用 asyncore 获得更好的性能,因为它将使用 select 或 poll 并且不需要产生额外的线程。
【讨论】: