python - 在 Python 中访问共享内存的段错误
问题描述
我在尝试访问共享内存时遇到了段错误,我将其归结为以下示例。f1
并且f2
是相同的,除了我将共享内存对象存储在一个额外的变量中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 数组保存的底层缓冲区。
推荐阅读
- tsql - 检查列类型 if 语句
- python - 有时列表中的一个已启动进程被卡住并阻塞了整个程序
- php - if(!isset($_SESSION['username'])) 导致用户从 verify_login_form.php 重定向回 index.php
- java - Spring @Qualifier 是否期望 bean ID 作为元素值?Spring @Qualifier 的元素 bean ID 是在幕后吗?
- angular - Angular 7 Service Worker 未在生产中缓存资产
- python - 无法启动芹菜工人(Flask 应用程序)
- python - 如何去除列中的特殊字符并将列转换为浮点数据
- laravel - 如何在 Laravel 上处理 'throw new DecryptException('The payload is invalid.')'
- gatling - 如何以 50 步递增计数器?
- hazelcast - 为什么 hazelcast-mancenter 看不到任何缓存统计信息?