我正在尝试使用一个名为unix的管道来输出正在运行的服务的统计信息。我打算提供与/proc类似的界面,在其中可以通过添加文件来查看实时统计信息。

我在我的python代码中使用了与此类似的代码:

while True:
  f = open('/tmp/readstatshere', 'w')
  f.write('some interesting stats\n')
  f.close()
/tmp/readstatshere是由mknod创建的命名管道。

然后,我将其分类以查看统计信息:
$ cat /tmp/readstatshere
some interesting stats

大多数情况下,它都能正常工作。但是,如果我快速连续地多次输入条目,有时我会得到多行some interesting stats而不是一行。一到两次,它甚至一直陷入无限循环,直到我杀死它为止一直打印那条线。到目前为止,我唯一的解决方法是在f.close()之后放置500ms的延迟,以防止出现此问题。

我想知道为什么会发生这种情况,以及是否有更好的处理方法。

提前致谢

最佳答案

管道在这里根本是错误的解决方案。如果要呈现流程内部状态的一致快照,请将其写入临时文件,然后将其重命名为“public”名称。这将防止在更新状态时其他进程读取状态可能引起的所有问题。另外,请勿在繁忙的循环中执行此操作,而最好在更新之间 hibernate 至少一秒钟的线程中执行此操作。

10-01 09:42