multithreading - 如何编写多线程perl脚本来写入日志文件?

标签 multithreading perl

日志文件需要时不时地更新。这里的问题是,如果我使用多线程写入相同的日志文件,我可能会看到有些行不正确。

my $date_string = strftime "%Y%m%d\_%H\_%M\_%S",localtime;

open(LOG,"+>","log\_$date_string.log")or die "cant open the file";


for ($count = 1; $count <=$thread_count ; $count++) 
{
    my $thread = threads->new(\&process);
    push(@threads,$thread);        

}

foreach (@threads) 
{
   $_->join;
}
close LOG;

sub process
{  ......
   ......
   print LOG "$datestring"."\|$process_id\|$host\|$port\|input\|Processing $filename\|\n";
}

对于上面的代码,我得到如下输出:

2014-05-20 12:12:46|19903|172.16.7.109|2000|input|Processing /opt/search_command/_13668.out|
2014-05-20 12:12:47|19903|172.16.7.109|2000|search|Processing /opt/search_command/_13668.out|0.940|
5-20 12:12:46|19903|172.16.7.109|2000|input|Processing /opt/search_command/_11061.out|
2014-05-20 12:12:47|19903|172.16.7.109|2000|search|Processing /opt/search_command/_11061.out|0.952|

如果您看到第三行日期打印不正确

我需要一个关于如何在 Perl 中使用多线程在日志文件中记录状态的解决方案。

提前致谢

最佳答案

您可以在写入之前锁定文件,并在写入之后释放锁定。

sub process {  
   lock(\*LOG);
   print LOG ..
   unlock(\*LOG);
}


use Fcntl qw(:flock SEEK_END);

sub lock {
  my ($fh) = @_;
  flock($fh, LOCK_EX) or die $!;
  seek($fh, 0, SEEK_END) or die $!;
}
sub unlock {
  my ($fh) = @_;
  flock($fh, LOCK_UN) or die $!;
}

关于multithreading - 如何编写多线程perl脚本来写入日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23753538/

相关文章:

python - 线程与异步

perl - 我应该如何使用作业队列 [和 Perl/Catalyst] 最好地构建我的 Web 应用程序?

c# - 从 C# 中的另一个线程修改类属性

java - 同步和线程

ios - 制作线程化的 NSURLConnections

perl - 自定义可存储 Hook ,用于克隆引用重量级对象的轻量级对象

perl - 为什么这行 Perl 代码会抛出数字 gt 警告?

Perl 面向对象编程 : Is it a good idea to outsource methods in your own modules

Perl 处理目录分隔符

c# - 尽管产生了意外的堆栈溢出