2016-04-29 202 views
3

我想在python中執行線程。我有100個單詞,並希望將它們放在6個不同的鏈接中。如果其中一個鏈接已準備就緒,我希望鏈接可以獲取新詞。而其他線程仍然在工作中的第一個字。當完成100個關鍵字時,我應該允許我的完整程序首先執行更多代碼。我有以下代碼:Python:線程只能啓動一次

threads = [] 

def getresults(seed): 
    for link in links: 
     t = threading.Thread(target=getLinkResult, args = (suggestengine, seed)) 
     threads.append(t) 
    for thread in threads: 
     thread.start() 

for seed in tqdm: 
    getresults(seed + a) 
    getresults(seed + b) 

for thread in threads: 
    thread.join() 

#code that should happen after 

我目前得到一個錯誤: 線程只能啓動一次

+0

請發表您的錯誤 –

+0

@Kasramvd有了這個代碼,我得到錯誤「的線程只能啓動一次」我怎樣才能改變我的代碼,使一切作品? – Sonius

+0

@GilbertAllen RuntimeError:線程只能啓動一次 – Sonius

回答

7

要調用getresults兩次,兩次,它們指的是同一個全局threads列表。這意味着,當您第一次撥打getresults時,會啓動線程。

當您第二次調用它們時,先前正在運行的線程會再次調用.start()方法。

您應該以getresults作爲本地線程開始線程,然後將它們附加到全局列表threads

雖然可以做到以下幾點:

for thread in threads: 
    if not thread.is_alive(): 
     thread.start() 

它不能解決問題,因爲一個或多個線程可能已經結束,因此再次啓動,因此會導致同樣的錯誤。

+0

如果我更改我的代碼,以便每個線程的thread.join在獲得結果後得到相同的錯誤 – Sonius

+0

@Sonius嘗試我的建議,看看它是否有效。它可能應該。 –

+0

作品,謝謝:) – Sonius

0

錯誤是明確的。你開始你的線程兩次,而你不應該。

getresults(seed + a) 
getresults(seed + b) 

當您對這些調用進行排序時,會啓動兩次線程循環。要正確地做你想做的事情,你要做一個thread pool and a task queue。基本上,你需要第二個單詞列表來處理和互斥。每個線程都會鎖定互斥鎖,讀取和取出一個單詞,然後解鎖並處理該單詞。

+0

雖然你的答案很好,但它並沒有服務於用戶的目的。用戶想要批量調用線程,即相同的線程需要重新啓動。 –

1

你應該開始在你的getresults只有新線索

threads = [] 

def getresults(seed): 
    local_threads = [] 
    for link in links: 
     t = threading.Thread(target=getLinkResult, args = (suggestengine, seed)) 
     local_threads.append(t) 
     threads.append(t) 
    for thread in local_threads: 
     thread.start() 

for seed in tqdm: 
    getresults(seed + a) 
    getresults(seed + b) 

for thread in threads: 
     thread.join() 
+0

這也是一個很好的做事方式。 –

+0

這是我第一次。但是我可以在5個線程中做1個字。如果所有5個線程都準備就緒,我可以做下一個單詞。但有了Games Brainic的解決方案,第三個單詞可以在第1個線程中,而第2個線程仍然可以在第1個單詞上運行:) – Sonius