python SharedMemory 进程间持久化

Posted

技术标签:

【中文标题】python SharedMemory 进程间持久化【英文标题】:python SharedMemory persistence between processes 【发布时间】:2021-03-03 01:08:23 【问题描述】:

有什么方法可以让 Python 中创建的 SharedMemory 对象在进程之间持久存在?

如果在交互式 python 会话中调用以下代码:

>>> from multiprocessing import shared_memory
>>> shm = shared_memory.SharedMemory(name='test_smm', size=1000000, create=True)

它在 Linux 机器上的/dev/shm/ 中创建一个文件。

ls /dev/shm/test_smm 
/dev/shm/test_smm

但是当 python 会话结束时,我得到以下信息:

/usr/lib/python3.8/multiprocessing/resource_tracker.py:216: 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 

test_smm 不见了:

ls /dev/shm/test_smm 
ls: cannot access '/dev/shm/test_smm': No such file or directory

那么有什么办法可以让python中创建的共享内存对象跨进程运行保持不变呢?

使用 Python 3.8 运行

【问题讨论】:

您能否在程序退出时将状态转储到文件中,并在其他进程启动时加载该状态? 我不能。该进程将连续写入,并且有另一个进程正在读取它。因此,如果出现任何问题并且进程崩溃或退出,我需要内存来保持。如果我使用sysv_ipc,我可以做到这一点。 【参考方案1】:

您可以在不取消链接的情况下从资源清理过程中取消注册共享内存对象:

$ python3
Python 3.8.6 (default, Sep 25 2020, 09:36:53) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import shared_memory, resource_tracker
>>> shm = shared_memory.SharedMemory(name='test_smm', size=1000000, create=True)
>>> resource_tracker.unregister(shm._name, 'shared_memory')
>>> 
$ ls /dev/shm/test_smm 
/dev/shm/test_smm

我不知道这是否可移植,而且它看起来不像是使用多处理模块的受支持方式,但它至少可以在 Linux 上运行。

【讨论】:

你是对的,这似乎是现在唯一的方法,但是 Python 有一个问题跟踪器来解决这个问题:bugs.python.org/issue38119

以上是关于python SharedMemory 进程间持久化的主要内容,如果未能解决你的问题,请参考以下文章

进程间资源共享&通信

深入详解Linux进程间通信之共享内存(Shared Memory)+信号量同步

深入详解Linux进程间通信之共享内存(Shared Memory)+信号量同步

深入详解Linux进程间通信之共享内存(Shared Memory)+信号量同步

如何查看哪些进程在使用共享内存

进程间通信