在Python中,命名管道没有刷新

4

我使用os.mkfifo()命令创建了一个命名管道。我有两个不同的Python进程访问这个命名管道,进程A正在读取,进程B正在写入。进程A使用select函数来确定fifo/pipe中是否有可用数据。尽管进程B在每次写入调用后都会刷新,但进程A的select函数并不总是返回(它继续阻塞,就好像没有新数据一样)。在广泛研究了这个问题之后,我最终只是编程让进程B在我的真实调用之前和之后添加5KB的垃圾写入,同样地,进程A被编程忽略那5KB。现在一切正常,select始终返回适当的结果。我通过注意到如果进程B被杀死(在它写入和刷新之后,它将在读取管道上休眠),进程A的select将返回来找到这个hack-ish的解决方案。Python对命名管道的flush有问题吗?


你能否发布一些最小化的测试代码,以展示问题。根据你描述的问题,大约十几行代码就足够了。 - kriss
3个回答

1
你在使用哪些API?os.read()os.write()不会缓存任何内容。

1

如果你在运行脚本时遇到了问题,想要确定 Python 的内部缓冲是否是原因之一,可以使用 "python -u" 命令来代替 "python"。这将强制 Python 进入 "无缓冲模式",使所有输出立即打印。


0

对于命名管道,刷新操作是无关紧要的;命名管道的数据严格保存在内存中,直到被读取或FIFO关闭才会释放。


3
如果应用程序级别缓冲了输出到管道的数据,那么"flush"操作仍然可能是相关的。 - Greg Hewgill
我猜测应用程序层面存在缓冲,有人知道是否有任何错误吗? - BrainCore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接