2016-12-07 25 views
1

我有兩個對象分享numpy的之間SciPy的對象處理

shared_array = numpy.zeros(20) 

shared_matrix = scipy.sparse.csr_matrix((data, (row, col)),(20,20),dtype=numpy.float64) 

,我想從

multiprocessing.Process(target = random_function, args = (shared_matrix, shared_array)) 

創建的所有進程訪問這是怎麼回事做了什麼?

回答

2

如果你只是想訪問它,你可以。您可以從由multiprocessing創建的所有進程中的全局變量中讀取數據。

但是,如果你想寫入例如一個字典(注意不要覆蓋),你可以使用共享內存對象。 multiprocessing內置manager,您可以從中調用所有共享內存對象,如列表,字典。

您將參數中的所有對象都傳遞給所有進程,但是如果您在對象內部進行更改,它不會永久存在,因爲它對於一個簡單函數來說不會是永久的。爲numpy的陣列

簡單的例子:

import numpy as np 
import multiprocessing 

a = np.zeros(5) 

def func(b): 
    ns.array += b 
    return 

manager = multiprocessing.Manager() 
ns = manager.Namespace() 
ns.array = np.zeros(5) 
pool = multiprocessing.Pool(2) 

list(pool.imap_unordered(func, [1,2])) 
print(ns.array) 

將輸出[ 3. 3. 3. 3. 3.]

這裏是另一個非常詳細的解決方案:https://stackoverflow.com/a/7908612/4555249

+0

我希望能夠讀取和寫入。我見過經理,但是他們是否使用'numpy.array'和'scipy.sparse.csr_matrix'? – Chicony

+0

正如我寫的,你可以閱讀'multiprocessing'產生的每個進程中的所有全局變量。你甚至不必將它們作爲參數傳遞。 –

+0

但我想能夠編輯它們,而不僅僅是閱讀。 – Chicony