2
# data is a list 

Threading_list=[] 

class myfunction(threading.Thread): 

    def __init__(self,val): 
     ....... 
    ....... 

    def run(self): 
     ....... 
     ....... 

for i in range(100000): 

    t=myfunction(data[i]) # need to execute this function on every datapoint 
    t.start() 
    Threading_list.append(t) 

for t in Threading_list: 
    t.join() 

這將創建大約100000個線程,但我可以創建最多32個線程? 這段代碼可以做些什麼修改?Python處理大量線程?

+0

你想在這裏實現什麼? – NPE

+2

您沒有使用某種工作人員池的任何特定原因?有了這麼多的工作線程,似乎需要重新思考。 –

+1

您的CPU是否支持100000個並行線程?如果是這樣,我可以在哪裏得到一個? –

回答

4

很多Python線程很少需要創建。更重要的是,我幾乎無法想象爲此的原因。有合適的架構模式來解決創建限制線程數的並行執行代碼的任務。其中之一是reactor

你想做什麼?

並且記住,由於GIL,即使在多處理器和多內核系統上,Python線程也不會爲計算任務提供任何性能提升(順便提一下,我可以肯定有一個100000內核系統嗎?)。提升的唯一機會是如果計算部分在用C/C++編寫的模塊內部執行,這些模塊在不獲取GIL的情況下完成其工作。通常Python線程用於並行執行包含阻塞I/O操作的代碼。

UPD:注意到stackless-python標記。 AFAIK,它支持微螺紋。但是,你仍然不清楚你想做什麼。

而且,如果你想只處理10萬個值(套用公式每個人?),最好是寫類似:

def myfunction(val): 
    .... 
    return something_calculated_from_val 

results = [myfunction(d) for d in data] # you may use "map(myfunction, data)" instead 

應該會好很多,除非myfunction()執行一些阻塞I/O。如果是這樣,ThreadPoolExecutor可能真的有幫助。

0

下面是一個計算任意長度列表的正方形的例子,使用32個線程通過ThreadPoolExecutor。正如Ellioh所說,在某些情況下,您可能不想使用線程,因此您可以輕鬆切換到ProcessPoolExecutor

import concurrent.futures 

def my_function(x): 
    return 2**x 

data = [1, 6, 9, 3, 8, 4, 213, 534] 

with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor: 
    result = list(executor.map(my_function, data)) 

print(result) 
+0

在Python 2中可以使用['multiprocessing.dummy.Pool'](http://stackoverflow.com/a/14594205/4279)來避免第三方依賴。在CPython – jfs

+0

中使用線程執行CPU綁定任務沒有意義。可能有,但前提是計算部分在執行計算時不使用GIL的非Python擴展模塊中執行。無論如何,目前還不清楚問題作者試圖達到什麼目的。我會等待任何包含代碼的解決方案,直到他澄清問題。 – Ellioh

+0

感謝Blaxpirit的迴應。我擁有1Lakh內核。我有10萬個數據值需要分開處理。除了線程,還有其他的方式嗎? – Mok