【问题标题】:What can be the possible situations where one should prefer the unbuffered output?在哪些情况下应该更喜欢无缓冲的输出?
【发布时间】:2011-07-03 04:22:16
【问题描述】:

通过previous question 中的讨论,我了解到 Perl 默认提供行缓冲区输出。

$| = 0; # for buffered output (by default)

如果您想获得无缓冲的输出,请将特殊变量 $| 设置为 1,即

$| = 1;  # for unbuffered output

现在我想知道在哪些情况下应该更喜欢无缓冲的输出?

【问题讨论】:

  • 注意设置 $| true 不会使输出无缓冲。输出仍将被缓冲,但缓冲区将比 $| 更频繁地刷新。是假的。
  • 哦,我明白了,非常感谢您提供此信息 tadmc :)
  • @tadmc、@Chankey Pathak、将$| 设置为true 确实 使输出无缓冲。所有数据在print 返回之前发送到操作系统。 (操作系统也可能会进行某种形式的缓冲,但那是不同的。这些缓冲区使用fsync(2) 刷新。)

标签: perl buffering output-buffering


【解决方案1】:

您希望交互式任务的无缓冲输出。我的意思是,当您期望某人或某物响应输出时,您不希望输出卡在某个缓冲区中。

例如,您不希望发送到 STDOUT 的用户提示被缓冲。 (这就是为什么 STDOUT 在连接到终端时永远不会完全缓冲的原因。它只是行缓冲,并且通过尝试从 STDIN 读取来刷新缓冲区。)

例如,您希望通过管道和套接字发送的请求不会卡在某个缓冲区中,因为连接的另一端永远看不到它。


我能想到的唯一另一个原因是,当出现不可恢复的错误(例如恐慌或信号死亡)时,您不希望重要数据被卡在缓冲区中。

例如,您可能希望保持日志文件不受缓冲,以便能够诊断严重问题。 (这就是默认情况下不缓冲 STDERR 的原因。)

【讨论】:

  • 日志文件和STDERR,是的,我们应该避免缓冲。
【解决方案2】:

【讨论】:

    【解决方案3】:

    它在通过套接字或管道写入另一个程序时很有用。当您将调试信息写入 STDOUT 以实时查看程序状态时,它也很有用。

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 2013-12-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多