2013-05-01 47 views
4

在此瑣碎蟒GObject的程序請看:Python線程不能與pygobject一起使用?

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。

回答

1

使用gobject時需要initialize threading。要做到這一點,請撥打

gobject.threads_init() 
+0

嗯,這似乎解決它,但也許這只是巧合,也許是從改變併發事件的順序。我發現一個庫會破壞整個運行時間,除非你在使用它之前調用一個函數。另外,「對於希望**使用Python線程與GNOME平臺**交互的應用程序,必須在運行或創建線程並啓動主循環之前調用GObject.threads_init()。」不包括我的情況,因爲我只使用主線程中的gobject。 – Dog 2013-05-01 11:48:55

+0

即使對於C中的glib,「**如果使用來自多個線程**的GLib,則必須通過調用g_thread_init()來初始化線程系統。」 (https://developer.gnome.org/glib/2.30/glib-Threads.html#g-thread-init) – Dog 2013-05-01 11:50:10

+0

我不完全知道爲什麼glib mainloop阻止所有其他線程,我會猜測它不會除非您正確初始化,否則在運行時不會釋放GIL。但我真的找不到任何支持的參考(除了[這裏](https://bugzilla.gnome.org/show_bug.cgi?id=686914))。 – mata 2013-05-01 11:59:28

相關問題