【发布时间】:2020-09-02 20:40:21
【问题描述】:
函数store_in_shm 将一个numpy 数组写入共享内存,而第二个函数read_from_shm 使用同一共享内存空间中的数据创建一个numpy 数组并返回该numpy 数组。
但是,在 Python 3.8 中运行代码会出现以下分段错误:
zsh: 分段错误 python foo.py
为什么从函数read_from_shm内部访问numpy数组没有问题,但是在函数外部再次访问numpy数组时出现分段错误?
输出:
From read_from_shm(): [0 1 2 3 4 5 6 7 8 9]
zsh: segmentation fault python foo.py
% /Users/athena/opt/anaconda3/envs/test/lib/python3.8/multiprocessing/resource_tracker.py:203: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown
warnings.warn('resource_tracker: There appear to be %d '
foo.py
import numpy as np
from multiprocessing import shared_memory
def store_in_shm(data):
shm = shared_memory.SharedMemory(name='foo', create=True, size=data.nbytes)
shmData = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf)
shmData[:] = data[:]
shm.close()
return shm
def read_from_shm(shape, dtype):
shm = shared_memory.SharedMemory(name='foo', create=False)
shmData = np.ndarray(shape, dtype, buffer=shm.buf)
print('From read_from_shm():', shmData)
return shmData
if __name__ == '__main__':
data = np.arange(10)
shm = store_in_shm(data)
shmData = read_from_shm(data.shape, data.dtype)
print('From __main__:', shmData) # no seg fault if we comment this line
shm.unlink()
【问题讨论】:
-
我通常在使用 python 的多处理管理器时遇到问题,只使用
multiprocessing.sharedctypes.RawArray和multiprocessing.Lock进行手动同步。通过您的示例,我实际上在 Mac 与 Windows 中得到了不同的答案,其中 Windows 在同一进程中成为close()d 后似乎无法重新打开文件。您收到的错误表明它希望您也可以在read_from_shm中使用closeshm,因为它表示您不是close()正在做某事。 -
显然在 Windows 中
unlink实际上什么都不做,并且一旦所有当前打开的副本都关闭,文件就会被销毁,因此内存在store_in_shm和read_from_shm之间被销毁,从而导致文件未找到错误。 -
@Aaron 如果我们在
read_from_shm内执行shm.close(),我认为numpy 数组shmData在访问shm中的缓冲区时遇到问题,因为shm现在已关闭。 -
是的,我仍在寻找它应该如何工作。如果我真的弄清楚了,我会发布一个实际的答案......
-
我最终可能不得不撤回我关于更喜欢
sharedctypes的声明。在深入研究代码之后,似乎shared_memory可能更简单、更轻量级(尽管它们在引擎盖下确实以类似的方式工作)。显然还有一些错误需要解决......
标签: python macos numpy shared-memory python-3.8