asyncore
是否可以通过dbus
相同的方式集成main loop
?
通常,DBus 集成是通过glib
主循环完成的:是否可以asyncore
集成这个主循环或使用 dbus asyncore
?
asyncore
糟透了。glib
已经提供了异步的东西,所以只需使用glib
's mainloop 来做所有事情。
我为我自己的一个项目写了一个简单的GSource
包装器,叫做AsyncoreGSource
只需将其附加到适当的MainContext
:
source = AsyncoreGSource([socket_map])
source.attach([main_context])
自然地,默认值分别是asyncore.socket_map
和默认值MainContext
。
你也可以试试monkey-patchingasyncore.socket_map
,如果我没有浏览GLib python bindings 源代码的GSource
话,这将是我的解决方案。
尽管您得到的答案可能是完全合理的,但还有另一种方法 - 您不需要使用 asyncore 本身的循环。只需使用零超时和计数 1 调用 asyncore.loop,它会停止它的迭代(从而使函数名称完全误导)并且只轮询一次套接字。根据需要经常调用它。
我对 glib 的异步支持一无所知,但如果它需要线程,您可能仍然可以通过以这种方式使用 asyncore 获得更好的性能,因为它将使用 select 或 poll 并且不需要产生额外的线程。