在Python 2.7中,如何使n个进程在长度可变的作业列表上运行?

时间:2019-02-24 20:59:38

标签: python performance multiprocessing batch-processing jobs

下面是我要做的事情的背景知识:下面我写了一些代码,这些代码将创建4个作业并运行它们。这些作业涉及大量数据,因此我想限制一次运行的数量。根据数据的内容,这些作业的执行时间可能在2到15分钟之间变化。下面,我编写了代码来批量运行这些作业(4个)。

Current Code execution

Desired Code execution

同样,这些工作需要花费多长时间来运行。因此,这似乎使得以4(或n)为批次运行作业可能会浪费时间。例如,给定4个作业,如果3个作业需要2分钟,而另一个作业需要10分钟,则只有一个进程运行8分钟。

所以我的问题是:有没有办法为某些功能/类/提供什么作业列表,以便使进程和作业的数量保持恒定?

        manager = multiprocessing.Manager()
        return_dict = manager.dict()

        jobs = []

        numOFProc = 4

        for api in WellAPIs: #iterate over individual wells in a file

            p = multiprocessing.Process(target=self.processWell, args=(df,CreatingPrediction,cache,df, newColList, clustringPredictionColName,return_dict,lock))
            jobs.append(p)

            p.start()

            numOfActiveProc = len(jobs)

            if numOFProc <= numOfActiveProc:
                for proc in jobs:
                    proc.join()
                jobs = []
            print "jobs: " + str(jobs)


        for proc in jobs:
            proc.join()
        jobs = []

        for parDF in return_dict.values():
            outDf = outDf.append(parDF)

2 个答案:

答案 0 :(得分:0)

您可能正在寻找Pool

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)   # NUMBER OF PROCESSES
    print(p.map(f, [1, 2, 3]))   # APPLIES `f` TO EACH ELEMENT
    # APPEND THIS TO MY TODO LIST AND PRINT IT WHEN IT'S DONE
    p.apply_async(f, (10,), callback=print)
    print(p.apply_async(f, (10,)).get())

您可以执行Pool(4),然后将map与任何可迭代对象一起使用,当消耗可迭代对象时,该函数将停止。另外,您可以使用apply async,该方法使用回调或.get()

答案 1 :(得分:0)

您所描述的是一个游泳池。 multiprocessing软件包具有您可以使用的实现。有关其用法的详细信息,请参阅官方文档。