Python多进程中共享内存的持久化

7

有没有办法让在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 3.8创建的共享内存对象在进程运行期间保持存在?


你能否在程序退出时将状态转储到文件中,在其他进程启动时加载该状态? - wakey
我不能这样做。该进程将持续写入,而另一个进程正在读取它。因此,如果有任何问题并且进程崩溃或退出,我需要让内存保持存在。如果我使用 sysv_ipc,我可以实现这一点。 - Karlson
1个回答

8
您可以在不取消链接的情况下,将共享内存对象从资源清理进程中注销:
$ 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

我不知道这是否具有可移植性,而且它似乎并不是使用multiprocessing模块的支持方式,但至少在Linux上可以运行。


你说得对,现在似乎只有这种方法,但是Python有一个问题跟踪器来解决这个问题:https://bugs.python.org/issue38119 - Karlson
@Diego Veralli,你是怎么发现这个模块的?在docs.python.org上似乎没有关于resource_tracker的文档。 - andreihondrari
1
@andreihondrari 我快速查看了shared_memory模块的源代码。 - Diego Veralli
文档中得知:“当一个进程不再需要访问一个共享内存块,但其他进程可能仍然需要访问它时,应该调用close()方法。”因此,为了完整起见,也许应该添加shm.close() - bers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接