【问题标题】:Thread-safe alternative to File::Tee?File::Tee 的线程安全替代方案?
【发布时间】:2014-04-24 14:21:20
【问题描述】:

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

是否有跨平台、线程安全的替代方案?

【问题讨论】:

    标签: multithreading perl logging


    【解决方案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;
    }
    

    【讨论】:

    • 嗯,所以我开始了这个实现,但是当我执行ppm install IO-Tee 时,我得到了ppm install failed: Can't find any package that provides IO-Tee
    • 这令人失望——IO::Tee 已经存在一段时间了,它与 Windows 兼容。不管。它也是一个带有单个文件的纯 perl 模块,[因此您可以将其复制] (cpansearch.perl.org/src/KENSHAN/IO-Tee-0.64/Tee.pm) 到您的系统库文件夹中。
    • 谢谢!我知道这对原始问题来说是多余的,但是您确实将其声明为my $tee = IO::Tee->new(\*STDOUT, "$ENV{PATH}\\build.log");,然后只声明print $tee "stuff";,对吗?
    • 查看文档中的EXAMPLEIO::Tee->new 的参数是文件句柄或旧式文件模式 + 文件名参数 (>foo.txt)。 $ENV{PATH}/build.log 可能会创建一个输入文件句柄,除非您将其写为 >$ENV{PATH}/build.log
    • 谢谢——我(出于某种原因故意)放弃了>
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多