我想要为我的线程脚本实现一些日志记录,我遇到了File::Tee。但是,在Windows框中尝试ppm
模块时,找不到它(根据activestate,Windows不支持)。
我真的很喜欢你可以通过以下方式锁定文件访问权限:
tee STDOUT, {mode => '>>', open => '$ENV{DOM}\\threaded_build.log', lock => 1};
tee STDERR, {mode => '>>', open => '$ENV{DOM}\\threaded_debug.log', lock => 1};
是否存在跨平台,线程安全的替代方案?
答案 0 :(得分:3)
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;
}