2014-07-04 55 views
1

我一直在並行調用myfunc與threading.Thread代碼如下限制使用的資源:由於數據的重要量在多線程

def myfunc(elt,other): 
    subprocess.call("A matlab script that takes a while to execute") 


allThreads = [] 

for elt in allElts: 
    allThreads.append(threading.Thread(target=myfunc,args=(elt,other))) 
for t in allThreads: 
    t.start() 
for t in allThreads: 
    t.join() 

,我面臨的一個內存問題:我的一些subscribe.call的引發記憶問題,無法分配。爲了避免這個問題,我試圖線程的量同時執行至8我改變以上以下的代碼來限制:

someThreads = [] 
k = 0 
for k in range(len(allElts)): 
    if k%8 == 1: 
     for t in someThreads: 
      t.start() 
     for t in someThreads: 
      t.join() 

     someThreads = [] 
     someThreads.append(threading.Thread(target=myfunc,args=(allElts[k],other))) 

    else: 
     someThreads.append(threading.Thread(target=myfunc,args=(allElts[k],other))) 
    k += 1 

這應該創建8個線程的最大和執行它們。 但是,這段代碼的結果與我之前得到的結果不同,顯然是錯誤的。它有什麼問題?

回答

5

線程直到k%8 == 1才啓動,然後將新線程添加到新的someThreads,,但未啓動

這意味着在循環結束時someThreads中至少有一個線程不會從調用t.start()開始。

相反,使用multiprocessing ThreadPool

import multiprocessing as mp 
import multiprocessing.pool as mpool 
pool = mpool.ThreadPool(8) 

for elt in allElts: 
    pool.apply_async(myfunc, args=(elt,other))  

pool.close() 
pool.join()