如何从Python创建glib.Source?

2 投票
2 回答
856 浏览
提问于 2025-04-16 09:56

我想把一些 asyncore.dispatcher 实例整合到 GLib 的 默认主上下文 中。

我想我可以创建一个 自定义的 GSource,这个东西能够检测 asyncore.socket_map 中各种套接字的事件准备情况。在 C 语言中,我相信这是通过创建必要的 GSourceFuncs 来完成的,这可能涉及到一些便宜且不阻塞的选择调用,然后使用 asyncore.read、.write 等方法来处理这些事件。

那么我该如何在 Python 中实际创建一个 GSource 呢?类 glib.Source 是 没有文档 的,尝试互动使用这个类的结果也一直没有成功。

有没有其他方法可以让我在 asyncore 模块中处理套接字事件,而不需要使用超时(或者其他可能影响吞吐量和 CPU 使用率的东西)呢?

2 个回答

-1

下面展示了一种简单的方法,可以把调度器和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)
0

glib.io_add_watch 这个函数的作用是:在主循环中对一个文件描述符(fd)进行监视。

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

撰写回答