我想为我拥有的线程脚本实现一些日志记录,我遇到了 File::Tee .然而,当试图 ppm
Windows 盒子上的模块,它没有找到(并且根据 activestate,Windows 不支持)。
我真的很喜欢您可以通过执行以下操作来锁定文件访问:
tee STDOUT, {mode => '>>', open => '$ENV{DOM}\\threaded_build.log', lock => 1};
tee STDERR, {mode => '>>', open => '$ENV{DOM}\\threaded_debug.log', lock => 1};
是否有跨平台、线程安全的替代方案?
最佳答案
File::Tee
格外注意处理通过 system
运行的外部程序生成的输出。或不通过 perlio 的 XS 代码。我认为这就是它与 Windows 不兼容的原因。IO::Tee
更具跨平台性,我认为使其线程安全并不难。 The sync code in File::Tee
看起来像:
flock($teefh, LOCK_EX) if $target->{lock};
print $teefh $cp;
flock($teefh, LOCK_UN) if $target->{lock};
您可以在
IO::Tee
中完成相同的操作通过修改几个方法:use Fcntl ':flock';
no warnings 'redefine';
sub IO::Tee::PRINT
{
my $self = shift;
my $ret = 1;
foreach my $fh (@$self) {
flock($fh, LOCK_EX);
undef $ret unless print $fh @_;
flock($fh, LOCK_UN);
}
return $ret;
}
sub IO::Tee::PRINTF
{
my $self = shift;
my $fmt = shift;
my $ret = 1;
foreach my $fh (@$self) {
flock($fh, LOCK_EX);
undef $ret unless printf $fh $fmt, @_;
flock($fh, LOCK_UN);
}
return $ret;
}
关于multithreading - File::Tee 的线程安全替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23271659/