[英]Why python multiprocessing always generate same random values
我正在使用 pool.map 来处理我的 function。 function 中添加了一个随机值。 但我发现每个过程的结果都是一样的。 如何为每个进程生成不同的随机值。 这是一个例子:
import numpy as np
from numpy.random import randn
def testfun(X):
scipy.random.seed
y = randn()
return y
from multiprocessing import Pool
pool = mp.Pool(processes = 8)
result = pool.map(testfun,np.arange(8))
我想要有 8 个不同的值。
scipy.random.seed
仅引用 function。 您实际上需要使用scipy.random.seed()
来调用它。
您需要提供不同的种子值。 您从范围中获得的值X
将做到这一点。 我无法执行您的代码,但我创建了它的简化版本:
from multiprocessing import Pool
import random
def testfun(seed_: int):
random.seed(seed_)
y = random.gauss(0, 1)
return y
if __name__ == "__main__":
pool = Pool(8)
result = pool.map(testfun, range(8))
print(result)
最好将pool
放入with
上下文管理器的环境中。
您需要做的是为多处理池中的每个进程(而不是每次调用rand
)为随机数生成器播种一次,这样做的方法是使用池初始化器,即在多处理上指定初始化器参数multiprocessing.Pool
构造函数。 您指定的这个 function 将在执行任何任务之前为池中的每个进程调用一次,并且可用于执行任何一次性初始化,例如设置全局变量,或者在这种情况下,为该进程播种随机数生成器。
import numpy as np
from numpy.random import randn, seed
def init_pool_processes():
seed()
def testfun(X):
y = randn()
return y
# Required by Windows:
if __name__ == '__main__':
from multiprocessing import Pool
pool = Pool(processes=8, initializer=init_pool_processes)
result = pool.map(testfun, np.arange(8))
print(result)
印刷:
[-0.01738709180801345, -0.6941424935875462, 0.41955492420787543, -0.890711442154167, -0.6894630549510319, 1.1549486347982545, -0.27329303494286733, 0.16447656347746123]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.