我有一个函数,希望并行执行几次,但同时只能定义一定数量的实例。
执行此操作的自然方法似乎是使用multiprocessing.Pool
。具体来说,文档说
一种常见的模式(...)是允许一个
池在退出之前仅完成一定数量的工作
进行清理,并产生了一个新流程来替换旧流程。的
池的maxtasksperchild
参数将此功能公开到最后
用户。maxtasksperchild
定义为:
maxtasksperchild
是工作进程可以执行的任务数
在退出并由新工人代替之前完成
进程,以释放未使用的资源。默认值
maxtasksperchild为None,这意味着工作进程将以
只要游泳池。
我不清楚任务在这里意味着什么。例如,如果我想让最多4个并行运行的worker实例启动multiprocessing.Pool
为
pool = multiprocessing.Pool(processes=4, maxtasksperchild=4)
processes
和maxtasksperchild
如何一起工作?我可以将processes
设置为10并且仍然只有4个工人在运行吗(实际上有6个进程处于空闲状态?) 最佳答案
正如doc所说(也在您的描述中),
进程是可以并行运行的并行工作程序数,如果未设置,它将与您计算机中的CPU数相同。
maxtasksperchild是每个进程可以处理的最大任务数,这意味着如果完成的任务数达到maxtasksperchild,则该进程将被杀死,并且将启动一个新进程并将其添加到Pool
让我检查一下代码:
def f(x):
print "pid: ", os.getpid(), " deal with ", x
sys.stdout.flush()
if __name__ == '__main__':
pool = Pool(processes=4, maxtasksperchild=2)
keys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = pool.map(f, keys)
这里我们使用4个进程,每个进程执行2个任务后将被杀死。执行代码后,您可以看到:
pid: 10899 deal with 1
pid: 10900 deal with 2
pid: 10901 deal with 3
pid: 10899 deal with 5
pid: 10900 deal with 6
pid: 10901 deal with 7
pid: 10902 deal with 4
pid: 10902 deal with 8
pid: 10907 deal with 9
pid: 10907 deal with 10
进程[10899-10902]中的每个进程执行2个任务后将被杀死,并且将使用新进程10907执行最后一个任务。
相比之下,如果我们使用更大的maxtasksperchild或默认值(这意味着进程将永远不会被杀死,并且只要Pool就可以存活),如下所示:
if __name__ == '__main__':
pool = Pool(processes=4, maxtasksperchild=10)
keys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = pool.map(f, keys)
结果:
pid: 13352 deal with 1
pid: 13353 deal with 2
pid: 13352 deal with 4
pid: 13354 deal with 3
pid: 13353 deal with 6
pid: 13352 deal with 7
pid: 13355 deal with 5
pid: 13354 deal with 8
pid: 13353 deal with 9
pid: 13355 deal with 10
如您所见,没有创建任何新流程,并且所有任务都由原来的4个流程完成。
希望这个有用〜
关于python - 如何限制并发 worker 的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32497549/