PyGTK 非阻塞

1 投票
3 回答
756 浏览
提问于 2025-04-17 02:23

有没有办法在进行一些耗时操作的时候,不让PyGTK卡住?我知道使用线程可以解决这个问题,但那样需要写很多代码和进行复杂的设置。

谢谢,

3 个回答

0

尽量避免使用线程,因为它们在PyGTK中表现得不好。有一些替代方案:

  • 对于需要从文件描述符读取的输入/网络操作,可以使用 glib.io_add_watch()。
  • 把操作放到一个单独的进程中,然后用 glib.spawn_async() 和它进行通信。

Twisted是一个很棒的网络库,它完全是非阻塞的,并且能很好地与PyGTK的主循环结合,建议考虑使用它。

1

在pygtk中,使用线程其实不是个好主意。你可以在你的耗时操作中检查主循环是否有事件发生,让主循环自己处理这些事情:

while my_operation_running:

    <my code>

    while gtk.events_pending():
        gtk.main_iteration()

或者你可以调整你的耗时操作,让它可以一步一步地运行,使用

glib.idle_add(function)

每当主循环没有事情可做的时候,它会调用“function”,你只需要确保这个函数能记录自己的进度,并且每次调用时只执行一步。

3

在PyGTK中设置一个后台线程其实 并没有那么复杂

撰写回答