我有一个 python 脚本,它以随机方式同时处理 numpy 数组和图像。为了在生成的进程中有适当的随机性,我将一个随机种子从主进程传递给工作人员,以便他们被播种。
当我使用maxtasksperchild
for 时Pool
,我的脚本在运行后挂起Pool.map
多次后挂起。
以下是重现问题的最小片段:
# This code stops after multiprocessing.Pool workers are replaced one single time.
# They are replaced due to maxtasksperchild parameter to Pool
from multiprocessing import Pool
import numpy as np
def worker(n):
# Removing np.random.seed solves the issue
np.random.seed(1) #any seed value
return 1234 # trivial return value
# Removing maxtasksperchild solves the issue
ppool = Pool(20 , maxtasksperchild=5)
i=0
while True:
i += 1
# Removing np.random.randint(10) or taking it out of the loop solves the issue
rand = np.random.randint(10)
l = [3] # trivial input to ppool.map
result = ppool.map(worker, l)
print i,result[0]
这是输出
1 1234 2 1234 3 1234 . . . 99 1234 100 1234 # 此时工作人员应该已经达到 maxtasksperchild 任务 101 1234 102 1234 103 1234 104 1234 105 1234 106 1234 107 1234 108 1234 109 1234 110 1234
然后无限期挂起。
我可能会numpy.random
用 python替换random
并摆脱这个问题。然而,在我的实际应用程序中,工作人员将执行我无法控制的用户代码(作为工作人员的参数),并希望允许numpy.random
在该用户代码中使用函数。所以我有意为全局随机生成器播种(每个进程独立)。
这是用 Python 2.7.10、numpy 1.11.0、1.12.0 和 1.13.0、Ubuntu 和 OSX 测试的