在多处理调用的函数中,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
也表现出相同的行为。数组的内容在改组,但在每个内核上改组为相同的值。
调用g(core)并置换数组的副本将返回4个相同的“改组”数组。这似乎表明工作副本不在子进程本地。
这可能表明随机数生成器在每个子进程中均被初始化,从而产生相同的序列。您需要为每个孩子的生成器添加种子(也许将孩子的进程ID放入混合中)。