常用名被重复了 2021-03-11 14:15 采纳率: 0%
浏览 142

multiprocessing.shared_memory共享内存命名后unlink出错

使用python3.8中新添加的multiprocessing.shared_memory实现共享内存,但是在调用unlink的时候会报以下错误:

Traceback (most recent call last):
  File "sharedmemory_client1.py", line 38, in <module>
    shm.unlink()
  File "/home/usr/miniconda3/lib/python3.8/multiprocessing/shared_memory.py", line 238, in unlink
    _posixshmem.shm_unlink(self._name)
FileNotFoundError: [Errno 2] No such file or directory: '/psm_20602223'

使用进程A和进程B来操作这块共享内存,只有在使用multiprocessing启动其他进程的情况下,unlink()才不会报错,如果采用其他启动方式(在终端中手动启动多个,使用subprocess模块启动其他进程等),在调用unlink()时都会报错,表示找不到这块共享内存。但是任意启动方式启动的进程都可以通过name属性获取,操作和修改这块共享内存。只有unlink的时候会有问题,造成程序出错和内存泄漏。

有大佬知道如何解决或改进这个问题吗?

附测试代码:

from multiprocessing import shared_memory
import multiprocessing as mp
import subprocess
import numpy as np
import time

def another(name):
    print('-------------------------')
    a = np.random.randint(0, 255, (12, 12, 12), dtype=np.uint8)
    shm_ = shared_memory.SharedMemory(name=name)
    b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
    print(b)
    print('--------set new----------')
    b[:] = a[:]
    print(b)

    shm_.close()

a = np.random.randint(0, 255, (12, 12, 12), dtype=np.uint8)
shm = shared_memory.SharedMemory(create=True, size=a.nbytes, name='fdas')
b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
b[:] = a[:]

print(shm.name)
print(b)

# 成功的
p = mp.Process(target=another, args=(shm.name, ))
p.start()
# 失败的,unlink会报错
# cmd = ['python', 'demo.py', '-n', shm.name]
# p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

time.sleep(30)
print('--------print new-----------')
print(b)

shm.close()
shm.unlink()
p.join()

测试的demo.py

import argparse
import numpy as np
from multiprocessing import shared_memory
import time

def main(name):
    print('--------start------------')
    a = np.random.randint(0, 255, (12, 12, 12), dtype=np.uint8)
    shm = shared_memory.SharedMemory(name=name)
    b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
    print(b)
    print('--------set new----------')
    b[:] = a[:]
    print(b)
    time.sleep(8)
    shm.close()


if __name__ == '__main__':
    parse = argparse.ArgumentParser()
    parse.add_argument('-n', '--name', type=str)
    args = parse.parse_args()

    print(args.name)
    main(args.name)
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 17:20
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类