2012-08-28 48 views
3

我是Python新手,所以如果這是明顯的道歉,我很抱歉。Python創建比預期多2倍的線程

我想構建多線程應用程序,但是當我想創建一個線程時,我得到兩個而不是一個。

MyThread.py

from threading import Thread 
import time 

class MyThreadClass(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "starting " + self.getName() + "\n" 
     from main import var1 
     while True: 
      print self.getName() + " is running\n" 
      print "value: " + var1 + "\n" 
      time.sleep(1) 

main.py

from MyThread import MyThreadClass 
var1 = "Test" 
MyThreadClass().start() 

我得到的輸出

Thread-1 is running 
Thread-2 is running 
Thread-1 is running 
Thread-2 is running 
Thread-1 is running 
Thread-2 is running 
..... 

爲什麼會發生?我注意到,如果我MyThreadClass().run()取代MyThreadClass().start()我得到2條線程,但其中只有一個保持運行

Thread-1 is running 
Thread-2 is running 
Thread-2 is running 
Thread-2 is running 
Thread-2 is running 
..... 

任何想法有什麼錯的代碼?

回答

9

當您在MyThread.py導入main.py

MyThreadClass()。開始()

被再次執行(因爲該模塊被加載),因此第二個線程開始行。


您也可以用

if __name__ == "__main__": 
    MyThreadClass().run() 

或更好更換該行中main.py創建保護條款,只是通過var1MyThreadClass作爲參數,以避免循環依賴。

MyThread.py

from threading import Thread 
import time 

class MyThreadClass(Thread): 

    def __init__(self, var1): 
     Thread.__init__(self) 
     self.var1 = var1 

    def run(self): 
     print "starting " + self.getName() + "\n" 
     while True: 
      print self.getName() + " is running\n" 
      print "value: " + self.var1 + "\n" 
      time.sleep(1) 

main.py

from MyThread import MyThreadClass 

if __name__ == "__main__": 
    MyThreadClass("Test").run() 
+0

多麼愚蠢的我,非常感謝! – NathanD

4

你啓動線程兩次,一次是當你運行main.py(因爲它是__main__模塊即可) ,並再次輸入MyThreadClassrun()方法。

import語句將運行模塊中的所有代碼,而不僅僅是你要求的; from表單很方便將特定項目引入當前命名空間。

它在兩個線程中停止的原因是因爲即使在第二個線程中再次導入main,Python也不會重新執行模塊的代碼,因爲它已被加載。如果它沒有被對於這一點,你就會有很多兩個以上的線程;-)

使用the other answer提到if __name__ == '__main__':結構不只是針對這種情況,但對於所有類型的模塊是非常有用的,因爲它允許你們都要執行它們(許多模塊將使用它作爲測試代碼)並導入它們,同時避免副作用。

相關問題