下面是我要做的事情的背景知识:下面我写了一些代码,这些代码将创建4个作业并运行它们。这些作业涉及大量数据,因此我想限制一次运行的数量。根据数据的内容,这些作业的执行时间可能在2到15分钟之间变化。下面,我编写了代码来批量运行这些作业(4个)。
同样,这些工作需要花费多长时间来运行。因此,这似乎使得以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)
答案 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
软件包具有您可以使用的实现。有关其用法的详细信息,请参阅官方文档。