脚本在处理从服务传输的标准输出时运行缓慢

脚本在处理从服务传输的标准输出时运行缓慢

我正在使用一个名为 oscdump 的实用程序,它在指定端口上侦听 OSC 消息并将消息打印到 stdout。我希望在脚本中解析和处理这些消息,但我的脚本运行非常不平衡,断断续续地打印其输出(作为测试)。

oscdump 在终端中独立运行,以均匀且快速响应的流形式打印收到的消息:

$ oscdump 12345
Running a server with port 12345
/param1 f 0.000000
/param1 f 0.000257
/param1 f 0.000534
/param1 f 0.000811
.... etc.

在我的测试脚本中,情况有所不同,非常不平衡。以下是脚本:

#! /bin/bash

echo $$ > /tmp/oscled.pid
ProcessMsg()
{
    while read msg
    do
    echo "Msg is $msg"
    done
}
oscdump 12345 | ProcessMsg

exit 0

这可能出了什么问题?

答案1

您应该使用oscdump -L 12345来禁用标准输出缓冲。

解释:

  • 当进程的标准输出打印在 tty 上时,输出会逐行打印,没有任何延迟。
  • 当一个进程的标准输出被重定向到文件或通过管道传输到另一个进程的标准输入时,会发生缓冲以减少 I/O 操作的数量。
  • 这在某些情况下会提高性能,但也会阻止第二个进程实时接收输出。
  • 因此,第二个过程将以较少的频率、大批量地接收输出,而不是频繁地逐行接收输出。

这篇博文以获得详细的技术解释。

也可以看看那篇博客文章以获得示例驱动的解释。

相关内容