【问题标题】:Share numpy and scipy objects between processes在进程之间共享 numpy 和 scipy 对象
【发布时间】:2017-04-22 09:18:55
【问题描述】:

我有两个对象

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

这是怎么做到的?

【问题讨论】:

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


    【解决方案1】:

    如果你只是想访问它,你可以。您可以跨由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

    【讨论】:

    • 我希望能够读写。我见过经理,但他们与numpy.arrayscipy.sparse.csr_matrix 合作吗?
    • 正如我所写,您可以读取multiprocessing 生成的每个进程内的所有全局变量。您甚至不必将它们作为参数传递。
    • 我会在我的回答中添加一个简单的例子
    • 该示例将输出[3,3,3,3,3] 有时。由于数组未锁定,因此可能会出现竞争条件,并且两个函数应用程序中只有一个被提交。结果也可以是[1,1,1,1,1][2,2,2,2,2],甚至可能是介于两者之间的任何东西(虽然我没见过)
    • 经理应该负责锁。我相信你永远不会看到 3333 之后的任何其他输出
    猜你喜欢
    • 2013-07-15
    • 2012-07-22
    • 2021-10-21
    • 2016-02-05
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多