python - 在 Python 中访问共享内存的段错误

标签 python shared-memory

我在尝试访问共享内存时遇到段错误,我将其归结为以下示例。 f1f2 是相同的,除了我将共享内存对象存储在 f2 的一个额外变量中,但是 f2 有效,f1 段错误。为什么会这样?

(以相反的顺序调用这两个函数不会改变行为。)

from multiprocessing import shared_memory
import numpy as np

segment_name = "segment"
data_shape = (5,5,5)


def get_view(shm):
    shape = (1,) + data_shape
    arr_one = np.ndarray(shape, dtype=np.float64, buffer=shm.buf)
    arr_two = np.ndarray(data_shape, dtype=np.float64, buffer=arr_one[0])
    return arr_two


def f1():
    arr = get_view(shared_memory.SharedMemory(name=segment_name))
    print(arr[0][0][0])


def f2():
    shm = shared_memory.SharedMemory(name=segment_name)
    arr = get_view(shm)
    print(arr[0][0][0])


if __name__ == '__main__':
    shape = (1,) + data_shape
    dummy = np.ndarray(shape, dtype=np.float64)
    shared_memory.SharedMemory(name=segment_name, create=True, size=dummy.nbytes)
    f2()
    f1()

最佳答案

事实证明,额外的引用是必要的。如果 arr 不指向共享内存对象,它的 del 方法将被立即调用并取消链接其引用由 numpy 数组保存的底层缓冲区。

关于python - 在 Python 中访问共享内存的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106751/

相关文章:

python - 模拟在被测方法中实例化的 Python 类

c++ - 如何在共享内存中存储字符串数据类型?

c - 第二个 shmget 总是返回拒绝访问

c - 使用共享内存时如何处理被杀(kill -9)?

node.js - Node.js 中的共享内部内存池是什么

c++ - 在 SharedMemory 中已存在的对象上放置 New

python - chardet 在 Big5 上显然是错误的

python - Python/Numpy 中的内联列分配

python - 如何向量化逻辑回归?

python - 为什么 urllib 2's .getcode() method crash on 404' s?