我有一个函数,希望并行执行几次,但同时只能定义一定数量的实例。

执行此操作的自然方法似乎是使用multiprocessing.Pool。具体来说,文档说


  一种常见的模式(...)是允许一个
  池在退出之前仅完成一定数量的工作
  进行清理,并产生了一个新流程来替换旧流程。的
  池的maxtasksperchild参数将此功能公开到最后
  用户。


maxtasksperchild定义为:


  maxtasksperchild是工作进程可以执行的任务数
  在退出并由新工人代替之前完成
  进程,以释放未使用的资源。默认值
  maxtasksperchild为None,这意味着工作进程将以
  只要游泳池。


我不清楚任务在这里意味着什么。例如,如果我想让最多4个并行运行的worker实例启动multiprocessing.Pool

pool = multiprocessing.Pool(processes=4, maxtasksperchild=4)


processesmaxtasksperchild如何一起工作?我可以将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/

10-11 22:21