Zah*_*Zah 10 python pid multiprocessing python-3.x
我需要在一个进程中运行一个函数,它几次与所有其他内存完全隔离.我想用multiprocessing它(因为我需要序列化来自函数的复杂输出).我设置start_method到'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()
Run Code Online (Sandbox Code Playgroud)
但是我得到的输出是:
$ 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
...
Run Code Online (Sandbox Code Playgroud)
因此,每个任务完成后都不会重新生成进程.有没有一种自动获取新PID的方法(即没有为每组进程启动新池)?
dan*_*ano 17
您还需要chunksize=1在调用中指定pool.map.否则,您的iterable中的多个项目将根据对工作进程的感知捆绑在一起形成一个"任务":
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()
Run Code Online (Sandbox Code Playgroud)
输出现在没有重复的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5270 次 |
| 最近记录: |