我有一个通过os.mkfifo()命令创建的命名管道。我有两个不同的Python进程访问这个命名管道,进程A正在读取,进程B正在编写。进程A使用select函数确定何时fifo / pipe中有可用数据。尽管进程B在每次写入调用之后都会刷新,但进程A的select函数并不总是返回(它会像没有新数据一样保持阻塞)。在广泛研究了这个问题之后,我最后编写了进程B,在我的真实调用之前和之后添加了5KB的垃圾写入,同样,进程A被编程为忽略那些5KB。现在一切正常,选择总是适当地返回。我注意到,如果进程B被杀死(在写入和刷新之后,它将在读取管道上休眠),进程A的选择将返回,我来到了这个hack-ish解决方案。 Python中的命名管道是否存在刷新问题?
答案 0 :(得分:1)
您使用的是哪些API? os.read()
和os.write()
不会缓冲任何内容。
答案 1 :(得分:1)
要了解Python的内部缓冲是否导致您的问题,在运行脚本时请执行“python -u”而不是“python”。这将强制python进入“无缓冲模式”,这将导致所有输出立即打印。
答案 2 :(得分:0)
刷新操作与命名管道无关;命名管道的数据严格保存在内存中,在读取或FIFO关闭之前不会被释放。