2016-12-04 45 views
0
import threading 
這個功能我想要做我的編碼的東西爲每個線程,但只有mainthread進入線程的這個功能沒有已經在主函數創建

進入此功能爲什麼只有MainThread達到我的功能?

def enrich(): 
    for i in range(10): 
     print(threading.current_thread().getName()) 



def main(): 
    Thread_0 = threading.Thread(target=enrich()) 
    Thread_1 = threading.Thread(target=enrich()) 
    Thread_2 = threading.Thread(target=enrich()) 
    Thread_3 = threading.Thread(target=enrich()) 
    Thread_4 = threading.Thread(target=enrich()) 
    Thread_5 = threading.Thread(target=enrich()) 
    Thread_6 = threading.Thread(target=enrich()) 
    Thread_7 = threading.Thread(target=enrich()) 

    Thread_0.setName('0') 
    Thread_1.setName('1') 
    Thread_2.setName('2') 
    Thread_3.setName('3') 
    Thread_4.setName('4') 
    Thread_5.setName('5') 
    Thread_6.setName('6') 
    Thread_7.setName('7') 

    Thread_0.start() 
    Thread_1.start() 
    Thread_2.start() 
    Thread_3.start() 
    Thread_4.start() 
    Thread_5.start() 
    Thread_6.start() 
    Thread_7.start() 

    Thread_0.join() 
    Thread_1.join() 
    Thread_2.join() 
    Thread_3.join() 
    Thread_4.join() 
    Thread_5.join() 
    Thread_6.join() 
    Thread_7.join() 
    if __name__ == "__main__": main() 

輸出我得到這樣的:

C:\Users\Danial\AppData\Local\Programs\Python\Python35\python.exe "D:/iaun/Final Project/FileTermsInfo/test.py" 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 

回答

1

這是你的問題:

Thread_0 = threading.Thread(target=enrich()) 

這裏你是,調用你的enrich()函數,而不是將該函數的引用傳遞給Thread構造函數。自然,這發生在主線程上,因爲還沒有其他線程。該函數返回None,因此實際上在構造函數中指定target=None,並且沒有任何線程接收到要調用的函數的引用。結果,他們都沒有做任何事情。在創建單個線程之前,所有對enrich()的調用都會發生,並且它們會按順序發生,而不是並行發生。

傳遞的功能,而不是它的結果是:

Thread_0 = threading.Thread(target=enrich) 

27:11你的其他線程。

此外,sheesh,使用列表而不是單個變量的線程。沒有理由讓所有的代碼在少數幾行中做你能做的事情。

threads = [threading.Thread(target=enrich, name=str(x)) for x in range(8)] 
for thread in threads: 
    thread.start() 
for thread in threads: 
    thread.join() 
+0

非常感謝kindall我想確保我做萬物的權利,這就是爲什麼我時,我想通過一些變量作爲輸入函數沒有使用列表 – danitiger33

+0

什麼情況呢? – danitiger33

+0

這就是構造函數的'args'參數。或者在某些情況下,使用lambda或'functools.partial'可能會更方便。 – kindall