multiprocessing.Pool 与 maxtasksperchild 产生相同的 PID

2023-11-26

我需要在一个与所有其他内存完全隔离的进程中运行一个函数多次。我想用multiprocessing为此(因为我需要序列化来自函数的复杂输出)。我设置了start_method to 'spawn'并使用一个游泳池maxtasksperchild=1。我希望每个任务都有不同的进程,因此会看到不同的 PID:

import multiprocessing
import time
import os

def f(x):
    print("PID: %d" % os.getpid())
    time.sleep(x)
    complex_obj = 5 #more complex axtually
    return complex_obj

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')
    pool = multiprocessing.Pool(4, maxtasksperchild=1)
    pool.map(f, [5]*30)
    pool.close()

然而我得到的输出是:

$ python untitled1.py 
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30018
PID: 30017
PID: 30019
PID: 30020
PID: 30018
PID: 30019
PID: 30017
PID: 30020
...

因此,在每个任务之后,进程不会重新生成。是否有一种每次自动获取新PID的方法(即无需为每组进程启动一个新池)?


您还需要指定chunksize=1在通话中pool.map。否则,从工作进程的角度来看,可迭代中的多个项目会捆绑在一起成为一个“任务”:

import multiprocessing
import time
import os

def f(x):
    print("PID: %d" % os.getpid())
    time.sleep(x)
    complex_obj = 5 #more complex axtually
    return complex_obj

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')
    pool = multiprocessing.Pool(4, maxtasksperchild=1)
    pool.map(f, [5]*30, chunksize=1)
    pool.close()

现在输出没有重复的 PID:

PID: 4912
PID: 4913
PID: 4914
PID: 4915
PID: 4938
PID: 4937
PID: 4940
PID: 4939
PID: 4966
PID: 4965
PID: 4970
PID: 4971
PID: 4991
PID: 4990
PID: 4992
PID: 4993
PID: 5013
PID: 5014
PID: 5012
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multiprocessing.Pool 与 maxtasksperchild 产生相同的 PID 的相关文章

随机推荐