perl:多线程写和尾文件

时间:2011-11-18 02:04:08

标签: multithreading perl

我正在研究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 个答案:

答案 0 :(得分: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永远不会花费超过   六十秒没有检查文件。

     

<强>间隔

     

将花费的初始秒数(实数)   在第一次检查文件之前睡觉。默认值是十秒,   意思是File :: Tail会睡10秒然后确定如何   文件中出现了许多新行。

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