4

我有一个通过 os.mkfifo() 命令创建的命名管道。我有两个不同的 Python 进程访问这个命名管道,进程 A 正在读取,进程 B 正在写入。进程 A 使用 select 函数来确定 fifo/管道中何时有可用数据。尽管进程 B 在每次写入调用后都会刷新,但进程 A 的 select 函数并不总是返回(它会一直阻塞,就好像没有新数据一样)。在深入研究了这个问题之后,我最终只对进程 B 进行了编程,使其在我真正调用之前和之后添加 5KB 的垃圾写入,同样,进程 A 被编程为忽略这 5KB。现在一切正常,并且 select 总是适当地返回。我注意到如果进程 B 被杀死,进程 A 的 select 将返回(在写入和刷新之后,它会睡在读取管道上)。Python中的flush是否有命名管道的问题?

4

3 回答 3

1

要查明 Python 的内部缓冲是否会导致您的问题,请在运行脚本时执行“python -u”而不是“python”。这将强制 python 进入“无缓冲模式”,这将导致所有输出立即打印。

于 2010-03-24T15:10:45.890 回答
1

您使用什么 API?os.read()并且os.write()不要缓冲任何东西。

于 2010-02-04T15:08:02.330 回答
0

刷新操作与命名管道无关;命名管道的数据严格保存在内存中,在读取或关闭 FIFO 之前不会被释放。

于 2010-01-26T01:00:50.050 回答