2011-05-23 146 views
1

我想要在後臺運行一個線程,我可以用一個gui按鈕關閉線程對象的go屬性爲false。但是線程只運行一秒鐘。Python 2:線程停止運行,我不知道爲什麼

class MyThread(threading.Thread): 
      def __init__(self): 
        threading.Thread.__init__(self) 
        self.go = True 
      def run(self): 
        while self.go: 
          print "okay!" 

這應該連續打印「好吧!」但事實並非如此。起初它什麼都不做。然後,當我按下gui按鈕停止它,然後啓動MyThread的另一個實例時,它會打印大約50行並停止。

我運行Ubuntu Linux操作系統11.04與Python 2.7.1

+0

是否有另一個線程持有進程並阻止此線程運行? – Dan 2011-05-23 00:09:50

+0

@Dan在主線程中有一個gtk主循環運行。不過,從我所讀的內容來看,I/O線程並不支持GIL。 gtk是一個例外嗎?我將如何解決這個問題? – Madeline 2011-05-23 01:55:20

回答

1

記住,Python中的所有線程(使用翻譯)都受到了GIL,因此只有過一個線程中運行Python代碼在任何時間。這意味着如果你在一個線程中持有GIL的python land中有一個繁忙的循環,它將停止執行另一個線程。要閱讀關於GIL的更多信息,請查看David Beazley的演示文稿:http://www.dabeaz.com/GIL/

+0

感謝您的回答。這就說得通了。我有gtk.main()在主線程中運行。所以我想我需要修復它,所以gtk不會保持gil。但我該怎麼做?它會涉及鎖定對象嗎? – Madeline 2011-05-23 01:52:47