5

在多处理调用的函数中,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)

编辑二: np.random.shuffle也表现出相同的行为。数组的内容正在改组,但在每个核心上都改组为相同的值。

4

2 回答 2

5

调用 g(core) 并排列数组的副本会返回 4 个完全相同的“混洗”数组。这似乎表明工作副本不是子进程的本地。

它可能表明随机数生成器在每个子进程中被相同地初始化,产生相同的序列。您需要为每个孩子的生成器播种(也许将孩子的进程 ID 放入混合中)。

于 2013-01-24T16:09:54.953 回答
4

要播种随机数组,这篇文章是最有用的。以下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)
于 2013-01-24T16:21:14.540 回答