在多处理调用的函数中,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
也表现出相同的行为。数组的内容正在改组,但在每个核心上都改组为相同的值。