如何在 Python 2.7 中将 n 个进程 运行 保留在长度不同的作业列表中?

How to keep n processes running on a list of jobs that vary in length in Python 2.7?

关于我正在尝试做的事情的一些背景知识:下面我编写了一些代码,这些代码将以 4 和 运行 为一组创建作业。这些作业涉及大量数据,因此我想限制一次 运行ning 的数量。根据数据内容,这些作业的执行时间可能在 2 - 15 分钟之间变化。下面我已经为 运行 这些作业编写了代码,每批 4 个。这很有效。

Current Code execution

Desired Code execution

同样,这些工作在完成 运行 所需的时间方面差异很大。因此,这使得 运行ning 作业以 4(或 n)个批次的形式出现可能会导致时间浪费。例如给定 4 个作业,如果 3 个需要 2 分钟,另一个需要 10 分钟,那么只有一个进程 运行ning 将有 8 分钟。

所以我的问题是:有没有办法为某些 function/class/whatever 提供作业列表,以便我可以保持进程和作业的数量 运行ning 不变?

        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)

您可能正在寻找 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,当可迭代对象被消耗时,函数停止。或者,您可以使用应用异步,它使用回调或 .get()

您描述的是一个游泳池。 multiprocessing 包有一个您可以使用的实现。具体使用方法请参考官方文档