我在两个不同的进程之间使用共享内存(sysv_ipc),我希望在另一个代码中看到共享内存的最后更新时间。有三个程序,一个写入共享内存,另一个从共享内存读取,第三个程序用于外部错误处理,因此我想知道共享内存是否在最后几分钟没有更新。有了这个想法,我尝试访问共享内存的属性"last_attach_time“。当我在终点站运行它的时候,它工作得很好。也就是说,我在终端中为共享内存创建了一个对象,然后我尝试继续访问该属性,它运行得非常好。在用数据编写共享内存之前,"last_attach_time“更新了时间,当写入停止时,输出变得恒定,这是非常好的。但是,当我在外部错误处理代码中包含了用于连续监视的while循环时,属性并没有给出正确的数据。即使停止了对共享内存的写入,时间仍然在增加。有没有人遇到过类似的问题?谢谢。
发布于 2017-09-04 12:29:30
我是Python模块的作者。
如果没有看到你的代码,我就不能确定到底发生了什么。但我有预感。
在监视器代码中,将内存段的last_pid值与os.getpid()值进行比较。如果是相同的,那么就有您的答案-- last_attach_time正确地报告了您的监视程序附加到内存上的时间,以查看是否有人连接到它。:-)
Fuller解释:使用SysV IPC内存段是一个两步的过程。首先创建它,然后附加它。对于没有附加的内存段,您不能做太多的事情,所以我将sysv_ipc模块写到中,在构造函数中自动为您附加这个段。换句话说,Python构造函数为您执行两个步骤(创建和附加)。当构造函数的文档中写着“内存是自动附加的”时,这就是它的意思(但这很容易被忽略)。
因此,如果您的监视器代码每次运行时都会创建一个新的sysv_ipc.Semaphore()对象,那么当它这样做时,它就会设置last_attach_time。
听起来您更感兴趣的是上一次写入时间,这不是SysV IPC提供的值。一种方法是编写时间戳,作为写入共享内存的数据的一部分。
https://stackoverflow.com/questions/45862512
复制相似问题