【问题标题】:Shared Memory sysv_ipc Python共享内存 sysv_ipc Python
【发布时间】:2018-02-02 09:20:19
【问题描述】:

我在两个不同的进程之间使用共享内存 (sysv_ipc),我想在另一个代码中查看共享内存的最后更新时间。有三个程序,一个写入共享内存,另一个从共享内存读取,第三个我需要用于外部错误处理,所以我想知道最近几分钟共享内存是否没有更新。有了这个想法,我尝试访问共享内存的属性“last_attach_time”。当我在终端中运行它时它工作正常。那就是我在终端中为共享内存创建了一次对象,然后我尝试连续访问该属性并且它工作得很好。在将数据写入共享内存之前,“last_attach_time”会更新时间,当写入停止时,输出变得恒定,这很好。但是当我包含在具有用于持续监控的while循环的外部错误处理代码中时,该属性没有提供正确的数据。即,即使停止写入共享内存,时间仍在增加。有没有人遇到过类似的问题? 谢谢。

【问题讨论】:

    标签: python sysv-ipc


    【解决方案1】:

    我是 Python sysv_ipc 模块的作者。

    没有看到您的代码,我无法确定发生了什么。但我有预感。

    在您的监控代码中,将内存段的last_pid 值与os.getpid() 的值进行比较。如果相同,那么这就是你的答案——last_attach_time 正确报告了你的监视器程序连接到内存的时间,以查看是否有人连接到它。 :-)

    更完整的解释:使用 SysV IPC 内存段是一个两步过程。首先创建它,然后附加它。没有附加的内存段不能做太多事情,所以我编写了sysv_ipc 模块来在 Python 构造函数中自动为你附加段。换句话说,Python 构造函数会为您完成这两个步骤(创建和附加)。当构造函数的文档说“内存是自动附加的”时,这就是它的意思(但这很容易忽略)。

    因此,如果您的监控代码每次运行时都会创建一个新的sysv_ipc.Semaphore() 对象,那么它会在执行此操作时设置last_attach_time

    听起来您对上次写入时间更感兴趣,这不是 SysV IPC 提供的值。一种方法是将时间戳作为写入共享内存的数据的一部分写入。

    【讨论】:

    • 在接收端: ------------------ while (Condition) { memory = sysv_ipc.SharedMemory(123456) mem_data = memory.read()打印“mem_data” current_time = time.time() time_delta = abs(current_time - memory.last_attach_time) ... }
    • 在传输端:--------------------- while(onSomeCondition) { int shmid; key_t 键 = 123456;字符 *shared_memory; if ((shmid = shmget(key, 30, IPC_CREAT | 0666))
    • 感谢您的友好回复。是的,我正在尝试检查内存是否在最后几秒钟内没有更新。基于此,我喜欢为我的程序创建一些行动目标。您为我寻找的方法提到了非常正确的词:“上次写入时间”。我没有使用信号量对象,而只使用共享内存对象。我必须检查不同的 PID 值,但据我了解,我正在为 while 循环之外的共享内存创建对象。所以内存块的PID不会改变,直到内存被清除。我需要确认一下,我会检查一下。
    猜你喜欢
    • 2016-12-13
    • 2021-09-24
    • 2014-10-08
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2011-01-14
    • 2015-03-15
    相关资源
    最近更新 更多