0

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

4

1 回答 1

0

我是 Pythonsysv_ipc模块的作者。

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

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

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

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

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

于 2017-09-04T12:29:30.500 回答