我有一个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秒钟来完成所有处理(我抽出的随机数),我是否必须担心我会错过日志消息或有内存问题?
通常,一个应用程序在管道上输出的数据将被缓冲,如果下一个应用程序不能足够快地消耗它.如果缓冲区填满,则输出应用程序被阻止(即调用写入输出文件句柄只是停止),直到消费者赶上.我相信Linux上的缓冲区是(或者是)65536字节.
以这种方式,您永远不会耗尽内存,但您可以严重阻止生产者应用程序在管道中.