【问题标题】:numpy arrays don't work with python multiprocessingnumpy 数组不适用于 python 多处理
【发布时间】:2018-01-31 05:44:32
【问题描述】:

我正在尝试在一个简单的for 循环中修改一个简单的数组。因为我的应用程序使用单线程似乎是一个瓶颈,所以我决定看一下 pythons 多处理 API。但是,似乎我无法同时修改一个 numpy 数组,即使我只修改每个元素一次。看看这个示例代码:

将 numpy 导入为 np 导入多处理

arrlen = 3
arr = np.zeros(arrlen)


def func(x):
    arr[x] = 1


for i in range(arrlen):
    func(i)

print(arr)

这一切都很好,我得到了[1.0, 1.0, 1.0],正如预期的那样。但是一旦我用pool.map 替换for 循环,它就不起作用了。

pool = multiprocessing.Pool()
pool.map(func, range(arrlen))

我检查了 PyCharm 调试器,func 实际上是使用正确的参数调用的,但第二个示例打印了 [0.0, 0.0, 0.0]。任何想法为什么?有什么想法可以解决这个问题吗?

【问题讨论】:

  • 工作进程无权访问主进程的对象。最多,他们得到副本,有时甚至没有。您正在对副本进行操作。
  • @user2357112 这是否意味着他们有不同的ID?因为id是一样的。
  • ID 仅在进程中有意义。不同进程中的对象可能具有相同的ID。
  • 跨进程共享对象非常重要。但是,如果您只需要一个原始数组,您可以使用docs.python.org/3.6/library/…
  • 我实际上需要一个二维阵列。谢谢@juanpa.arrivillaga,我会调查的。

标签: python numpy multiprocessing python-multiprocessing


【解决方案1】:

当使用多处理时,您生成的每个线程都会在其自己的范围内接收处理对象。

您的函数需要返回一个值,然后您需要将它们聚合到您的全局数组中。

生成的线程无法访问全局数组。 所以

def func(x):
    return = 1

然后

arr = np.array(pool.map(func, range(arrlen)))

会做你想做的。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多