Jzl*_*325 4 python numpy multiprocessing
在多处理调用的函数中,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)
Run Code Online (Sandbox Code Playgroud)
调用时f(core),x变量是进程的本地变量,即.它按预期打印一个不同的随机整数.这些从不超过10,表明x=0在每个过程中.那是对的吗?
调用g(core)和置换数组的副本将返回4个相同的'shuffled'数组.这似乎表明工作副本不是本地子进程.那是对的吗?如果是这样,除了使用sharedmemory空间之外,当需要从共享内存空间填充时,是否可以让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)
Run Code Online (Sandbox Code Playgroud)
编辑II:
np.random.shuffle也表现出相同的行为.数组的内容是混乱的,但是在每个核心上拖曳到相同的值.
调用g(核心)并置换数组的副本将返回4个相同的'shuffled'数组.这似乎表明工作副本不是本地子进程.
它可能表明的是随机数生成器在每个子进程中被相同地初始化,产生相同的序列.你需要为每个孩子的生成器播种(可能将孩子的进程id扔进混合).