管道中的数据是否会被Perl读取?

Tho*_*ens 3 io perl pipe

我有一个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);
Run Code Online (Sandbox Code Playgroud)

在目前的形式中,我是否必须担心线路读取和处理"备份"?例如,如果我每1秒钟收到一条新的日志消息,并且需要5秒钟来完成所有处理(我抽出的随机数),我是否必须担心我会错过日志消息或有内存问题?

Ada*_*ght 9

通常,一个应用程序在管道上输出的数据将被缓冲,如果下一个应用程序不能足够快地消耗它.如果缓冲区填满,则输出应用程序被阻止(即调用写入输出文件句柄只是停止),直到消费者赶上.我相信Linux上的缓冲区是(或者是)65536字节.

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