如何解决python的shared_memory自动删除的问题

最近用python来写一个读取共享内存的程序,发现每次程序退出后会自动把这个共享内存给删掉,而实际没有调用任何close或del的方法,查阅了下资料,发现了如下bug:

Issue 38119: resource tracker destroys shared memory segments when other processes should still have valid access - Python trackericon-default.png?t=O83Ahttps://bugs.python.org/issue38119

研究了半天,找到一个解决办法
python 3.8 - Shared memory deleted at exit - Stack Overflowicon-default.png?t=O83Ahttps://stackoverflow.com/questions/64102502/shared-memory-deleted-at-exit

具体代码如下:

from multiprocessing import shared_memory,resource_tracker

shm_name = '/test_share'

shm = shared_memory.SharedMemory(name=shm_name,create=False)

resource_tracker.unregister(f'/{shm_name}', "shared_memory")

  注:要在共享名称前还要加个符号/

 

 

使用共享内存(shared memory)可以显著提高多进程程序之间的数据交换速度,因为共享内存是一种在进程之间共享和传递数据的高效方式,它允许多个进程访问同一块内存空间。在Python中,可以使用`multiprocessing`模块中的`shared_memory`来实现这一点。以下是一个简单的例子来展示如何使用共享内存: ```python import multiprocessing import numpy as np # 创建一个numpy数组,用于演示共享内存 data = np.array([1, 2, 3, 4, 5]) # 创建一个共享内存块 shmem = multiprocessing.shared_memory.SharedMemory(create=True, size=data.nbytes) # 在共享内存中创建一个numpy数组 shared_data = np.ndarray(data.shape, dtype=data.dtype, buffer=shmem.buf) # 确保子进程可以访问这个共享内存 child_pid = multiprocessing.Process(target=worker, args=(shmem.name,)) child_pid.start() # 主进程中的操作 print("主进程中的数据:", shared_data[:]) # 等待子进程结束 child_pid.join() # 清理资源 shmem.close() shmem.unlink() ``` 在上面的代码中,我们创建了一个`SharedMemory`对象,并指定了`create=True`来创建一个新的共享内存块,以及`size`参数来指定共享内存的大小。然后,我们使用`numpy.ndarray`创建了一个数组,这个数组指向我们刚刚创建的共享内存块。这样,主进程和子进程都可以访问同一个共享内存中的数据。 使用共享内存提高性能的方法是通过减少进程间通信的开销,特别是在数据量较大时。进程不再需要复制数据到它们的地址空间,而是直接在共享内存块上进行读写操作。这大大减少了内存使用和数据传输的时间,从而提升了性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值