2012-03-17 30 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

相關問題