2015-06-12 72 views
3

現在我有一個for循環遍歷列表,通常這個列表是100-500項長。在for循環中,每個項目打開一個新線程。所以現在我的代碼看起來是這樣的:Python線程在一個循環,但最大線程

threads = [] 
    for item in items: 
     t = threading.Thread(target=myfunction, args=(item,)) 
     threads.append(t) 
     t.start() 

但我不希望每次啓動一個新的線程,看到只需要每個線程幾秒鐘MAX執行MyFunction的。我想繼續做我的循環,在參數中調用每個項目的功能。但是一旦完成就關閉線程,並讓另一個線程接管。我想打開的最大線程數不少於3,不超過20個。雖然如果更容易,那麼範圍可能會有所不同。我只是不想在循環中打開每個項目的新線程。

對於那些很好奇,如果它很重要。 myfunction是我定義的一個函數,它使用urllib向站點發送post請求。

我是python的新手,但我並不是全新編碼在一起。對於noob問題抱歉。

+0

'threading.activeCount()'可以幫助你決定是否產生一個線程或者在那裏執行'myfunction',然後將它傳遞給當前'item'。 – Pynchia

+0

好吧。那麼我的代碼看起來像threading.activeCount()> 20,而不僅僅是執行myfunction,否則啓動線程? – user1687621

+0

是的,我已經添加了它作爲答案,我花了一些時間來測試它 – Pynchia

回答

1

我相信你的問題在於缺失的功能。它可能是一個數量的問題,我建議您訪問蟒蛇主頁:https://goo.gl/iAZuNX

#!/usr/bin/python 

import thread 
import time 

# Define a function for the thread 
def print_time(threadName, delay): 
    count = 0 
    while count < 5: 
     time.sleep(delay) 
     count += 1 
     print "%s: %s" % (threadName, time.ctime(time.time())) 

# Create two threads as follows 
try: 
    thread.start_new_thread(print_time, ("Thread-1", 2,)) 
    thread.start_new_thread(print_time, ("Thread-2", 4,)) 
except: 
    print "Error: unable to start thread" 
+0

錯誤:無法啓動線程 – Gank

3

我認爲你正在尋找一個線程池來解決你的問題。

this question的答案詳細說明了一些可能的解決方案。

最簡單的(假設python3或pypi的反向移植)的是:

from concurrent.futures import ThreadPoolExecutor 

executor = ThreadPoolExecutor(max_workers=10) 
futures = [] 
for item in items: 
    a = executor.submit(myfunction, item) 
    futures.append(a) 

這將用於使用10個線程的所有項目執行myfunction的。您可以稍後等待使用期貨清單完成呼叫。

1

稍微修改代碼以包括在任何給定時間對活動的線程數量的檢查:

threads = [] 
consumed_by_threads = 0 
consumed_by_main = 0 
for item in items: 
    at = threading.activeCount() 
    if at <= 20: 
     t = threading.Thread(target=myfunction, args=(item,)) 
     threads.append(t) 
     consumed_by_threads += 1 
     t.start() 
    else: 
     print "active threads:", at 
     consumed_by_main += 1 
     myfunction(item) 

print "consumed_by_threads: ", consumed_by_threads 
print "consumed_by_main: ", consumed_by_main 

# here the rest of your code, thread join, etc 

注:我只是檢查線程的最大數量。 BTW:它應該是21,因爲主線程計算在內(見here並按照鏈接enumerate

諾塔Bene的:像往常一樣,仔細檢查一下多線程對特定的應用,根據受益在哪個python實現上使用以及線程是cpu綁定還是I/O綁定。