共享numpy数组的Python多处理

问题描述:

假设我创建了一个具有2维numpy数组的对象A作为属性。然后我使用Process API创建了10个线程来随机设置A的行。我想知道如果我编写以下代码,是否在所有Process(线程)之间共享self.x,或每个Process(线程)只有一个副本?共享numpy数组的Python多处理

如果不共享,我将失去所有更新,对不对?

import numpy as np 
from multiprocessing import Process 

class A: 

    def __init__(): 
     self.x = np.zeros((3,4)) 

    def update(): 
     threads = [] 
     for i in range(10): 
      trd = Process(target=self.set, args=(i,)) 
     threads.append(trd) 
     trd.start() 

     for i in range(10): 
      threads[i].join() 

    def set(i): 
     self.x[i/3] = np.random.rand(1,4) 


if ___main___: 
     a = A() 
     a.update() 

不,它不共享。您生成多个进程,每个进程复制父进程的文件描述符,并与共享对象。

要创建共享共享变量,请使用ctype对象。的

所以不是声明数组 -

from multiprocessing import Array 
self.x = Array('i', [0]*10) 

如果你仍然想使numpy的阵列共享的阵列,看看 -

self.x = np.zeros((3,4)) 

您可以使用此Array声明它在这个伟大的answer

这里的警告是,它可能并不那么容易。您还必须锁定共享数组以避免任何竞争条件。