python多處理模塊有一個複雜的問題。 我已經構建了一個腳本,在一個地方必須爲specyfic列表中的每個元素調用一個多參數函數(call_function)。我的想法是定義一個整數'N',並將這個問題分解爲單個子進程。在python中爲迭代任務創建n個進程
li=[a,b,c,d,e] #elements are int's
for element in li:
call_function(element,string1,string2,int1)
call_summary_function()
彙總函數將分析循環的所有迭代獲得的結果。現在,我希望每個迭代都由單個子進程執行,但不能超過N個子進程。如果是這樣,主進程應該等到1個子進程結束,然後再執行一次迭代。而且,call_sumary_function需要在所有子過程完成後調用。
我已盡全力與多處理模塊,鎖和全局變量,以保持子進程的實際數量運行(與N比較),但每次我得到錯誤。
// -------------- EDIT ------------- //
首先,主處理代碼:
MAX_PROCESSES=3
lock=multiprocessing.Lock()
processes=0
k=0
while k < len(k_list):
if processes<=MAX_PROCESSES: # running processes <= 'N' set by me
p = multiprocessing.Process(target=single_analysis, args=(k_list[k],main_folder,training_testing,subsets,positive_name,ratio_list,lock,processes))
p.start()
k+=1
else: time.sleep(1)
while processes>0: time.sleep(1)
現在:由多進程調用的函數:
def single_analysis(k,main_folder,training_testing,subsets,positive_name,ratio_list,lock,processes):
lock.acquire()
processes+=1
lock.release()
#stuff to do
lock.acquire()
processes-=1
lock.release()
我得到int值(處理變量)始終爲0,因爲single_analysis()
功能似乎產生了新的,局部變量processes
錯誤。 當我改變流程,以全局和函數內的global
關鍵字它導入single_analysis()
並鍵入print processes in
我得到len(li)
次1 ...
你可以顯示你試過的代碼(使用'multiprocessing')嗎?(這會給出錯誤)? – 2014-09-12 16:03:37
multiprocessing.Pool類可以做你想做的。它確實讓N個孩子爲你活着。你試過了嗎? – tdelaney 2014-09-12 16:09:12
Tom Dalton:完成了,我添加specyfic說明:) tdelaney:我有紅色的使用池,你不能用多個參數調用函數。 – maciek 2014-09-12 16:19:18