gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:19:58 29 4
gpt4 key购买 nike

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

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";
}

对于上面的代码,iam的输出如下:
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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com