Python多处理Numpy Random

Python多处理Numpy Random,python,numpy,multiprocessing,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.

在多处理调用的函数中,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个相同的“无序”数组。这似乎表明工作副本不是子进程的本地副本。对吗?如果是这样,除了使用sharedmemory空间之外,当需要从共享内存空间填充数据阵列时,它是否可能是子进程的本地数据阵列

编辑:

更改
g(core)
以添加一个随机整数似乎具有所需的效果。数组的值显示不同的值。
排列
中一定发生了某种事情,它将列(每个子进程的本地)随机排序为相同的…想法

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
也表现出同样的行为。数组的内容正在洗牌,但在每个核心上洗牌到相同的值

def g(core):
    pid = mp.current_process()._identity[0]
    randst = np.random.mtrand.RandomState(pid)
    randarray = randst.randint(0,100, size=(1,100)
调用g(core)并排列数组的副本将返回4个相同的“无序”数组。这似乎表明工作副本不是子进程的本地副本

它可能表明,随机数生成器在每个子进程中初始化相同,生成相同的序列。您需要为每个子级的生成器设定种子(可能会将子级的进程id放入混合中)。

为随机数组设定种子是最有用的。下面的
g(core)
函数成功地为每个core生成了一个随机排列

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

我认为这可能只是随机数生成器+线程=可能的故障(即,你一次幸运,一次不幸运)。您可能只需要确保分别为每一个初始化一个随机状态,或者像这样
np.random.RandomState
@seberg我也厌倦了使用
np.random.random\u integer
,但是返回的数组在各个进程中是相同的。您是在引用'np.random.mtrand.RandomState'吗?因此,为每个子进程实例化一个随机类,因为它们可能实例化一个类或相互覆盖?不确定它们何时被实例化,但我不确定它们是否能够碰巧完全相同地实例化(它们可能使用系统时间),或者可能只是在分叉时复制相同的状态,简而言之,至少调用一次
np.random.seed()
np.random.mtrand.RandomState
显示了相同的问题。这些文档看起来像是类使用了机器时钟。seed()也存在同样的问题。看起来我要么需要插入延迟,要么接受“随机性”。这会出现在OP的注释中。使用pid或
randomint(01000)
进行种子设定不会改变随机解。@当状态相同时,使用随机整数进行Jzl5325种子设定是毫无意义的。。。请尝试在函数
np.random.seed(pid)
中使用pid进行种子设定?我想与子进程共享父进程的numpy随机状态。我试过使用Manager,但仍然没有成功。请你看看我的问题,看看你能不能提供一个解决方案?如果每次生成一个随机数时都执行np.random.seed(None),我仍然可以得到不同的随机数,但这不允许我使用父进程的随机状态,这不是我想要的。非常感谢您的帮助。