我正在尝试使用 unix 命名管道来输出正在运行的服务的统计信息。我打算提供一个与 /proc
类似的界面,人们可以在其中通过抓取文件来查看实时统计信息。
我在我的 python 代码中使用了与此类似的代码:
while True:
f = open('/tmp/readstatshere', 'w')
f.write('some interesting stats\n')
f.close()
/tmp/readstatshere
是由mknod
创建的命名管道。
然后我 cat 它以查看统计信息:
$ cat /tmp/readstatshere
some interesting stats
大多数情况下它工作正常。但是,如果我快速连续多次 cat 条目,有时我会得到多行 some interesting stats
而不是一行。有一两次,它甚至进入了一个无限循环,永远打印那一行,直到我杀死它。到目前为止,我唯一的解决办法是在 f.close()
之后延迟 500 毫秒,以防止出现此问题。
我想知道为什么会发生这种情况,以及是否有更好的处理方法。
提前致谢
最佳答案
管道在这里只是错误的解决方案。如果您想呈现流程内部状态的一致快照,请将其写入临时 文件,然后将其重命名为“公共(public)”名称。这将防止在您更新状态时其他进程读取状态可能引起的所有问题。此外,不要在繁忙的循环中执行此操作,但最好在更新之间至少休眠一秒钟的线程中执行此操作。
关于python - UNIX 命名的 PIPE 文件结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540460/