File :: Tee的线程安全替代方案?

时间:2014-04-24 14:21:20

标签: multithreading perl logging

我想要为我的线程脚本实现一些日志记录,我遇到了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};

是否存在跨平台,线程安全的替代方案?

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