我有一个Perl脚本,该脚本执行一个长时间运行的过程并观察其命令行输出(日志消息),其中一些是多行长。一旦收到完整的日志消息,它将发送出去进行处理并获取下一条日志消息。

open(PS_F, "run.bat |") or die $!;

$logMessage = "";

while (<PS_F>) {
    $lineRead = $_;

    if ($lineRead =~ m!(\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2})!) {
        #process the previous log message

        $logMessage = $lineRead;
    }
    else {
        $logMessage = $logMessage.$_;
    }
}

close(PS_F);

以当前形式,我是否需要担心行读取和处理“备份”?例如,如果我每隔1秒钟收到一条新的日志消息,并且需要5秒钟来完成所有处理(我提取的随机数),我是否需要担心会丢失日志消息或出现内存问题?

最佳答案

通常,如果下一个应用程序无法足够快地消耗它,则一个应用程序在管道上输出的数据将被缓冲。如果缓冲区已满,则输出应用程序将被阻塞(即,调用写入输出文件句柄的过程只是停止),直到使用者追上来。我相信Linux上的缓冲区是(或曾经是)65536字节。

以这种方式,您永远不会耗尽内存,但是您可能会严重阻塞生产者应用程序在管道中。

09-27 23:22