首页 文章

perl:多线程写和尾文件

提问于
浏览
3

我正在研究perl多线程的简单用例:一个线程写入文件,另一个线程写入文件 . 这是代码:

use strict;
use warnings;
use threads;
use File::Tail;

my $file = 'data.txt';
sub tail_file{
    my $file=File::Tail->new($file);
    while (defined(my $line=$file->read)) {
        print "$line";
    }
}

sub write_file{
    open (MYFILE, ">> $file");
    print MYFILE scalar localtime .  "  A data.\n";
    close (MYFILE); 
    print 'write done!';
}

my $t_tail = threads->new(\&tail_file);
$t_tail->join();

my $t_write = threads->new(\&write_file);
$t_write->join();

运行时,该程序卡在控制台上 .

1 回答

  • 1

    如果你摆脱了 $t_tail->join() 的调用,你的程序实际上工作正常 . 你需要摆脱这个调用,因为你的 $t_tail 线程将永远运行(因此永远不会 join ),你的 $t_write 线程将永远不会被启动 .

    但是,你应该知道,即使你摆脱了那一行,如果 $t_write 线程在 $t_tail 线程之前执行(因为从不保证执行带线程的顺序),那么你可能就是你写完文件了在 File::Tail 对象被初始化之前 . 并且由于 File::Tail 仅捕获在初始化之后发生的文件的更改,因此可能看起来根本没有发生任何事情 .

    最后,您可能认为 File::Tail 与Linux / Unix tail 类似,但documentation表明模块使用的默认等待时间与Linux / Unix相比相当慷慨:

    maxinterval将花费睡眠的最大秒数(实数) . 默认值为60,这意味着File :: Tail在不检查文件的情况下永远不会花费超过60秒 . interval首次检查文件之前将花费的初始秒数(实数) . 默认值为10秒,这意味着File :: Tail将休眠10秒钟,然后确定文件中出现了多少新行 .

    如果您运行程序,并且在开始写入文件之前确实初始化了 File::Tail 对象,那么在您在控制台上看到任何内容之前,您可能需要等待一段时间(10秒) .

相关问题