【问题标题】:How to create a glib.Source from Python?如何从 Python 创建一个 glib.Source?
【发布时间】:2011-01-14 07:46:03
【问题描述】:

我想将一些 asyncore.dispatcher 实例集成到 GLib 的 default main context 中。

我想我可以创建一个custom GSource,它能够检测asyncore.socket_map 中各种套接字上的事件准备情况。在 C 语言中,我相信这是通过创建必要的 GSourceFuncs 来完成的,这可能涉及对 select 的廉价和非阻塞调用,然后使用 asyncore.read、.write 和朋友处理它们。

如何从 Python 实际创建 GSource? glib.Source 类是undocumented,尝试以交互方式使用该类是徒劳的。

是否有其他方法可以让我处理asyncore 模块中的套接字事件而不诉诸超时(或任何危及潜在吞吐量和 CPU 使用率的事情)?

【问题讨论】:

    标签: python pygtk glib asyncore


    【解决方案1】:

    glib.io_add_watch 做到了(在 fd 上添加一个监视到主循环):

    http://library.gnome.org/devel/pygobject/2.26/glib-functions.html#function-glib--io-add-watch

    【讨论】:

      【解决方案2】:

      下面显示了一种将调度程序与 glib 循环集成的简单方法,非常简化:

      from asyncore import dispatcher, loop
      from glib import MainLoop, idle_add
      
      def loop_one():
          loop(timeout=0, count=1)
          return True
      
      idle_add(loop_one)
      

      【讨论】:

      • 我的问题是:不诉诸超时(或任何危及潜在吞吐量和 CPU 使用率的事情)。您可以删除答案。
      • 由于超时为零,它不会真正使用超时,该函数将直接返回(实际上只要它处理完数据,但它永远不会等待 io)无论哪里有任何数据阅读与否。
      • 只要默认主循环没有更高优先级的事件挂起,就会调用这个函数,所以是的,它会无缘无故地占用 CPU。如果你不能真正使用事件,那么使用事件循环是没有意义的!
      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2010-12-04
      • 2020-04-30
      • 2012-06-16
      • 2015-10-12
      相关资源
      最近更新 更多