如何在 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
包有一个您可以使用的实现。具体使用方法请参考官方文档
关于我正在尝试做的事情的一些背景知识:下面我编写了一些代码,这些代码将以 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
包有一个您可以使用的实现。具体使用方法请参考官方文档