【发布时间】:2021-02-02 03:17:21
【问题描述】:
我试图通过修改一个共享的 numpy 数组来构建一个新的 Python SharedMemory 类的简单示例。我在网上看到了一些例子:
Shared memory in multiprocessing
Is shared readonly data copied to different processes for multiprocessing?
但是,由于某种原因,它们都更改了__main__ 块内的共享数组,然后将其打印出来。但是,我想从函数中返回一个共享数组并在以后重用它。这是我的尝试:
from multiprocessing import shared_memory
import numpy as np
def create_shared_array():
# instantiate array
np_array = np.ones((5, 2, 2))
# instantiate shared array
shm = shared_memory.SharedMemory(size=np_array.nbytes, create=True)
# copy data from original array into shared array
array_shared = np.ndarray(np_array.shape, dtype=np_array.dtype, buffer=shm.buf)
array_shared[:] = np_array[:]
return shm
def change_and_return(name):
existing_shm = shared_memory.SharedMemory(name=name, create=False)
array_shared = np.ndarray((5, 2, 2), dtype=np.float64, buffer=existing_shm.buf)
# change shared array
array_shared[0] = 888
return array_shared
shm = create_shared_array()
result = change_and_return(shm.name)
print(result)
由于某种原因,此代码在我的 Windows 机器上返回 "The instruction at <memory address> referenced memory at <another address>. The memory could not be read."。
但是,如果我只是替换它
return array_shared
有了这个
return array_shared.copy()
然后它就可以正常工作了。
我的想法:
由于change_and_return 没有返回existing_shm,所以它会被垃圾回收,array_shared 也会被销毁。但是,我确实确保不要杀死 shm,所以引用应该仍然存在?
问题:为什么需要额外的副本以及避免制作额外副本的正确方法是什么?
更新:让我在这里澄清一下 - 我想更改共享内存中的数组值,但之后我想以非共享方式使用它.就像一个普通的 numpy 数组。所以问题基本上是是否可以在不复制的情况下将共享数组转回非共享数组?
【问题讨论】:
-
"那么它工作得很好。" - 不,它没有。该副本不受共享内存的支持。
-
在这种情况下,该代码对我有用 - 它对你来说会破坏吗?
-
它运行时不会引发异常,但它实际上并没有工作——它默默地失败了,做的事情与你的意图完全不同。同样,副本不受共享内存的支持。
-
“没有例外”和“作品”是完全不同的东西。
标签: python numpy shared-memory