【问题标题】:为什么python多处理总是生成相同的随机值
【发布时间】:2022-01-17 23:17:39
【问题描述】:

我正在使用 pool.map 来处理我的函数。函数中添加了一个随机值。但我发现每个过程的结果都是一样的。如何为每个进程生成不同的随机值。 这是一个例子:

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 个不同的值。

【问题讨论】:

标签: python random multiprocessing


【解决方案1】:

scipy.random.seed 只是引用该函数。您实际上需要使用scipy.random.seed() 调用它。

【讨论】:

    【解决方案2】:

    您需要提供不同的种子值。您从范围中获得的值 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 上下文管理器中。

    【讨论】:

      【解决方案3】:

      您需要做的是为多处理池中的每个进程(而不是每次调用rand)播种随机数生成器一次,这样做的方法是使用池初始化器,即在multiprocessing.Pool 构造器上指定initializer 参数。在执行任何任务之前,您指定的此函数将为池中的每个进程调用一次,并可用于执行任何一次性初始化,例如设置全局变量,或者在这种情况下,为该进程播种随机数生成器。

      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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-25
        • 2019-06-14
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多