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

标签 multithreading perl logging

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

相关文章:

multithreading - 如何推理互斥体构成的正确性?

c++ - 单线程设计还是多线程设计?

perl - Moose:通过创建对象检查属性

java - 即使级别关闭时也会创建 log4j2 日志文件吗?

Python 单例日志记录无法正常工作 - 文件中存在重复的日志语句

c++ - 如何在多线程中只插入一次 vector

multithreading - 波尔多线程 : how to kill a thread?

Perl:如何获取 key "keys on reference is experimental"上的 key

linux - 在 Linux/Perl 上获取权限位字符串?

c - C 中的文件 IO 单元测试