Python 线程不适用于 pygobject?

标签 python asynchronous concurrency pygobject gobject

看看这个简单的 python gobject 程序:

import threading
import gobject
import time

def f():
    while True:
        print "HELLO"
        time.sleep(1)
threading.Thread(target=f).start()

gobject.MainLoop().run()

它生成一个每秒输出“HELLO”的线程,然后进入 gobject 主循环。问题是它实际上并没有做任何事情。为什么?

$ python a.py 
[...]

但是,如果我按下 CTRL+C,它就会开始工作。此外,删除程序中的最后一行 (gobject.MainLoop().run()) 使其工作。为什么?

$ python a.py 
^CTraceback (most recent call last):
  File "a.py", line 11, in <module>
    gobject.MainLoop().run()
KeyboardInterruptHELLO

HELLO
HELLO
HELLO
[...]

看看第二个程序,除了它告诉 gobject 每秒运行函数 g 之外,它与第一个完全相同。这是一种工作方式,生成的线程每隔一段时间运行一次,而不是从不运行。为什么?

import threading
import gobject
import time

def f():
    while True:
        print "HELLO"
        time.sleep(1)
threading.Thread(target=f).start()

def g():
    print "yo"
    return True
gobject.timeout_add_seconds(1, g)

gobject.MainLoop().run()

运行它:

$ python b.py 
HELLOyo

yo
yo
yo
 HELLO
yo
yo
yo
yo
yo
yo
yo
 HELLO
yo
yo
yo
yo
^CTraceback (most recent call last):
  File "b.py", line 16, in <module>
    gobject.MainLoop().run()
KeyboardInterrupt
HELLO
HELLO
HELLO
HELLO
HELLO

再一次,按 CTRL+C 使生成的线程工作。为什么?

这是使用库 pygobject-2.28.6。

最佳答案

您需要initialize threading使用 gobject 时。为此,请调用

gobject.threads_init()

关于Python 线程不适用于 pygobject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312928/

相关文章:

c# - 异步线程体循环,它只是工作,但如何?

android - native 模块 RNC_AsyncSQLiteDBStorage 试图覆盖 AsyncStorageModule

java - 从特定方法调用时,JFrame 中的内容不显示

python - Scipy loadmat 只加载整数?

python - 在 Odoo 9 的编辑模式下,在复选框上使用 Onchange 装饰器的方法无法正常工作

asynchronous - F#:从接受回调并返回取消句柄的函数创建异步

java - 无法在 RejectionHandler 中获取 CallableThread

Python socket.listen(...)

python - pyinstaller 不显示图像和图标

python - 如何恢复扁平化 Numpy 数组的原始索引?