Python的多处理NumPy的随机[复制](Python Multiprocessing Nump

2019-07-18 16:24发布

这个问题已经在这里有一个答案:

  • 在不同的工人相同的输出在多处理 2个回答

请问内通过多进程调用的函数不同的一个numpy的ndarray功能的范围是什么? 下面是一个例子:

使用Python的多处理模块,我打电话像这样的功能:

for core in range(cores):
    #target could be f() or g()
    proc = mp.Process(target=f, args=(core))
    jobs.append(proc)
for job in jobs:
    job.start()
for job in jobs:
    job.join()

def f(core):
    x = 0
    x += random.randint(0,10)
    print x

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    shuffled = np.random.permutation(local)

调用f(core) ,则x变量是本地的过程中,即 其打印效果与预期不同,随机整数。 这些从未超过10,说明x=0中的每个过程。 那是对的吗?

调用g(core)和置换所述数组的副本返回4相同地“改组”的阵列。 这似乎表明,工作副本不在本地子进程。 那是对的吗? 如果是的话,除了使用共享内存空间,是有可能有一个ndarray是本地的子进程时,需要从共享内存空间充满了吗?

编辑:

改变g(core)添加一个随机整数似乎具有期望的效果。 该阵列的展会不同的值。 一定有什么在发生的permutation是随机排序的列(本地为每个子进程)一样的...想法?

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    local += random.randint(0,10)

编辑II: np.random.shuffle也表现出相同的行为。 所述阵列的内容被重排,但洗牌在每个核心的相同的值。

Answer 1:

调用克(核)和置换所述数组的副本返回4相同地“改组”的阵列。 这似乎表明,工作副本不在本地子进程。

它所可能表明是随机数发生器在每个子进程初始化相同,产生相同的序列。 你需要种子每个孩子的发电机(也许扔孩子的进程ID来混合使用)。



Answer 2:

要播种的随机阵列这篇文章是最有用的。 下面g(core)函数成功地生成用于每个核心的随机排列。

def g(core):
    pid = mp.current_process()._identity[0]
    randst = np.random.mtrand.RandomState(pid)
    randarray = randst.randint(0,100, size=(1,100)


文章来源: Python Multiprocessing Numpy Random [duplicate]