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

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

通常,DBus 集成是通过glib 主循环完成的:是否可以让asyncore 集成这个主循环让 dbus 使用asyncore 的?

【问题讨论】:

  • 当你有 glib 的时候为什么要使用 asyncore? glib 似乎更有能力......

标签: python dbus asyncore


【解决方案1】:

asyncore 糟透了。 glib 已经提供了异步的东西,所以只需使用 glib 的主循环来做所有事情。

【讨论】:

    【解决方案2】:

    我为my own projects 之一写了一个简单的GSource 包装器AsyncoreGSource

    只需将attach 发送到适当的MainContext

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

    当然,默认值分别是asyncore.socket_mapdefault 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。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2015-02-02
    • 2011-11-26
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多