【发布时间】:2020-09-28 12:47:57
【问题描述】:
我有两个脚本,一个用于创建和写入共享内存块,另一个用于读取该共享内存。 问题是当第一个脚本结束时,即使我没有取消链接,共享内存也会被删除。 这是我的第一个脚本:
import argparse
import csv
import os
import subprocess
import sys
import time
from classes.rtData import RtData
from multiprocessing import shared_memory
if '__main__' == __name__:
sys.stdout.write('starting server ... \n')
service = RtData()
shm_a = shared_memory.SharedMemory(name='rtdata', create=True, size=len(msg))
data = shm_a.buf
data[0] = 42
shm_a.close
添加断点时,我可以看到共享内存已创建:
$ ls -l /dev/shm/
共 0 -rw------- 1 facundo facundo 4 Sep 28 09:41 rtdata
但是当脚本退出时,共享内存被删除(所以我不能用第二个脚本读取它)
【问题讨论】:
-
共享内存块将持续存在,只要任何进程打开它。终止创建进程不会自动删除共享内存。
-
这就是我的问题。也许顺序应该是: a) 进程 I 创建共享内存,但不关闭它。 b) 进程 II 打开相同的共享内存并使用它。但这不是我需要的。这个想法是一个进程有责任保持共享内存更新(但在这样做之后完成执行)......然后应该触发的任何其他进程访问共享内存以使用它。
-
如果我正确理解您的情况,听起来常规文件将是更合适的解决方案。共享内存(和类似概念)实际上是用于在同时运行的进程之间共享数据。
-
我正在寻找的是处理许多不同时运行的进程共享的内存区域(将根据请求运行)。它是针对 scada 系统中的数据采集。让我困惑的是文档中的文本“只要打开任何进程,共享内存块就会一直存在。终止创建进程不会自动删除共享内存”(调用 .unlink 方法)