Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用共享numpy数组的Python多处理_Python_Arrays_Multithreading_Numpy - Fatal编程技术网

使用共享numpy数组的Python多处理

使用共享numpy数组的Python多处理,python,arrays,multithreading,numpy,Python,Arrays,Multithreading,Numpy,假设我创建了一个具有二维numpy数组作为属性的对象A。然后,我使用ProcessAPI创建了10个线程来随机设置A的行 我想知道我是否编写了以下代码,self.x是否在所有进程(线程)之间共享,或者每个进程(线程)都只有一个副本 如果不共享,我将丢失所有更新,对吗 import numpy as np from multiprocessing import Process class A: def __init__(): self.x = np.zeros((3,4))

假设我创建了一个具有二维numpy数组作为属性的对象A。然后,我使用ProcessAPI创建了10个线程来随机设置A的行

我想知道我是否编写了以下代码,self.x是否在所有进程(线程)之间共享,或者每个进程(线程)都只有一个副本

如果不共享,我将丢失所有更新,对吗

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()

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

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

因此,与其将数组声明为-

self.x = np.zeros((3,4))
您可以使用此-

如果仍然希望使numpy数组成为一个共享数组,请看下面这个很棒的例子

这里的警告是,这可能没那么容易。您还必须锁定共享阵列以避免任何竞争条件

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