共享内存sysv_ipc Python

时间:2017-08-24 13:08:57

标签: python sysv-ipc

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

1 个答案:

答案 0 :(得分:0)

我是Python sysv_ipc模块的作者。

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

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

富勒解释:使用SysV IPC内存段分为两步。首先你创建它,然后你附加它。你没有对你没有附加的内存段做很多事情,所以我写了sysv_ipc模块给在Python构造函数中自动附加段。换句话说,Python构造函数为您执行两个步骤(创建和附加)。当构造函数的文档说“内存自动附加”(但这很容易被忽略)时,这意味着什么。

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

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