【问题标题】:Named pipe is not flushing in Python命名管道在 Python 中没有刷新
【发布时间】:2011-01-09 08:38:32
【问题描述】:

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

【问题讨论】:

  • 您能否发布一些显示问题的最小测试代码。正如你描述的问题,大约十几行就足够了。

标签: python select ipc named-pipes flush


【解决方案1】:

flush 操作与命名管道无关;命名管道的数据严格保存在内存中,直到读取或关闭 FIFO 才会释放。

【讨论】:

  • 如果输出到管道的数据在应用程序级别被缓冲,则刷新操作仍然是相关的。
  • 我猜是应用层有缓冲,有谁知道有什么bug吗?
【解决方案2】:

您使用什么 API? os.read()os.write() 不缓冲任何内容。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      相关资源
      最近更新 更多