2014-09-12 73 views
1

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 ...

+1

你可以顯示你試過的代碼(使用'multiprocessing')嗎?(這會給出錯誤)? – 2014-09-12 16:03:37

+1

multiprocessing.Pool類可以做你想做的。它確實讓N個孩子爲你活着。你試過了嗎? – tdelaney 2014-09-12 16:09:12

+0

Tom Dalton:完成了,我添加specyfic說明:) tdelaney:我有紅色的使用池,你不能用多個參數調用函數。 – maciek 2014-09-12 16:19:18

回答

1

什麼你所描述的是pefectly適合multiprocessing.Pool - 特別是其map方法:

import multiprocessing 
from functools import partial 

def call_function(string1, string2, int1, element): 
    # Do stuff here 

if __name__ == "__main__": 
    li=[a,b,c,d,e] 
    p = multiprocessing.Pool(N) # The pool will contain N worker processes. 

    # Use partial so that we can pass a method that takes more than one argument to map. 
    func = partial(call_function, string1,string2,int1) 

    results = p.map(func, li) 
    call_summary_function(results) 

p.map將在li列表呼籲call_function(string1, string2, int1, element),每個elementresults將是一個列表,其中包含每次調用call_function時返回的值。您可以將該列表傳遞給call_summary_function以處理結果。

+0

非常感謝! 我嘗試過Pool()之前,但我失蹤'偏' 你保存了一天:) – maciek 2014-09-12 18:28:34