在python中为迭代任务创建n个进程

时间:2014-09-12 16:02:00

标签: python process locking multiprocessing

我遇到了python多处理模块的复杂问题。 我已经构建了一个脚本,在一个地方必须为specyfic列表中的每个元素调用一个多参数函数(call_function)。我的想法是定义一个整数' 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。

我已经尽力使用多处理模块,Locks和全局变量来保持实际的子进程数运行(与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。 当我将流程更改为全局并使用single_analysis()关键字在global中导入并在函数中输入print processes in时,我会len(li)次1 ...

1 个答案:

答案 0 :(得分:1)

您所描述的内容完全适合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会针对call_function(string1, string2, int1, element)列表中的每个element致电liresults将是一个列表,其中包含每次调用call_function时返回的值。您可以将该列表传递给call_summary_function以处理结果。