我有一个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字节。
以这种方式,您永远不会耗尽内存,但是您可能会严重阻塞生产者应用程序在管道中。