在进程之间共享numpy和scipy对象

时间:2016-12-07 12:18:18

标签: python numpy scipy shared-memory python-multiprocessing

我有两个对象

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

这是怎么做到的?

1 个答案:

答案 0 :(得分:2)

如果您只是想访问它,您可以。您可以在multiprocessing创建的所有进程中读取全局变量中的数据。

但是,如果要写入例如字典(小心不要覆盖),则可以使用共享内存对象。 multiprocessing内置manager,您可以在其中调用所有共享内存对象,例如列表,dicts。

您在参数中传递所有对象,因此它可用于所有进程,但是如果您在对象内部进行更改,它将不会是永久性的,因为它不会是一个简单函数的永久性。

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