2012-03-17 68 views
9

我需要为多维数组或列表创建一个共享对象,以便其他进程可以使用它。有没有一种方法来创造它,因为我所看到的是不可能的。我曾尝试:我可以在python中为多处理创建共享的多阵列或列表对象列表吗?

from multiprocessing import Process, Value, Array 
arr = Array('i', range(10)) 
arr[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
arr[2]=[12,43] 
TypeError: an integer is required 

听说numpy的阵列可以多阵列和一个共享对象,如果上面是不可能有人可以告诉我如何做一个numpy的阵列的共享对象?

+0

我不确定多处理部分,但我知道你为什么在那里接收TypeError:你在第二行初始化整数值的数组。在第5行中,您尝试将列表分配给数组中的某个点。数组是相对较低级别的对象,不能包含列表,字典,集合和其他python容器类型。 – 2012-03-17 21:56:50

+0

是的,这就是我知道的,我知道为什么我得到TypeError。这就是为什么我问是否有办法来超越这个问题,或创建一个共享对象“列表”,或者可能如何使用numpy数组,可以是多数组并使它们成为共享对象。 – user1249212 2012-03-17 22:07:55

+0

查看这些。然后,围绕它们构建数据结构:http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm。 – MrGomez 2012-03-17 23:16:31

回答

21

要使numpy的阵列的共享对象(full example):

import ctypes as c 
import numpy as np 
import multiprocessing as mp 

n, m = 2, 3 
mp_arr = mp.Array(c.c_double, n*m) # shared, can be used from multiple processes 
# then in each new process create a new numpy array using: 
arr = np.frombuffer(mp_arr.get_obj()) # mp_arr and arr share the same memory 
# make it two-dimensional 
b = arr.reshape((n,m)) # b and arr share the same memory 

如果您不需要共享(如“共享相同的内存”)对象和单纯可以从多个流程中使用的对象是足够,那么你可以使用multiprocessing.Manager

from multiprocessing import Process, Manager 

def f(L): 
    row = L[0] # take the 1st row 
    row.append(10) # change it 
    L[0] = row #NOTE: important: copy the row back (otherwise parent 
       #process won't see the changes) 

if __name__ == '__main__': 
    manager = Manager() 

    lst = manager.list() 
    lst.append([1]) 
    lst.append([2, 3]) 
    print(lst) # before: [[1], [2, 3]] 

    p = Process(target=f, args=(lst,)) 
    p.start() 
    p.join() 

    print(lst) # after: [[1, 10], [2, 3]] 

the docs

服务器进程管理器比使用共享内存 对象更灵活,因为它们可以支持任意对象类型。 此外,单个管理员可以通过网络上的不同 计算机上的进程共享。但是,它们比使用共享的内存要慢。

+0

这似乎是一个很好的解决方案,我想我会使用管理员,因为他们似乎是一个解决方案,使我的预先存在的代码很少修改,事实上,它甚至可以通过网络工作,使其理想为我的下一个fase项目。 – user1249212 2012-03-18 00:15:42

+0

只是一个简单的问题,管理员会创建一个新的列表副本,然后在进程之间同步它,还是将它从列表中共享内存? – user1249212 2012-03-18 00:47:16

+0

@ user1249212:对它进行建模,就好像进程始终分布在网络上一样。 – jfs 2012-03-18 03:26:16

2

为什么不创建Array的列表?

arrays = [Array('i', range(10))] * 10 
+0

其实mooooeeeep在[先前的回答]中提到它(http://stackoverflow.com/a/9743806/1258041) – 2012-03-17 22:36:43

+0

这是因为我认为没有共享对象的列表和我以前做我的代码的方式函数必须是意识到(矩阵1的至少一行和矩阵2的所有行)。我知道还有很多其他方法可以轻松地为我组织矩阵,而不需要共享多个数组或列表,但我想知道如何做到这一点的所有可能性。 – user1249212 2012-03-17 23:12:19

相关问题