2011-11-18 62 views
3

我正在处理一个简单的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

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

但是,您应该知道,即使您摆脱了该行,如果$t_write线程在$t_tail线程之前执行(由于线程的执行顺序从未得到保证),您可能会遇到这种情况在你的对象被初始化之前写入文件。并且由于File::Tail仅捕获在之后发生的文件的更改,所以它被初始化,它可能看起来像什么都没有发生。

最后,你可能会认为File::Tail的工作方式类似于在Linux/Unix tail,但documentation显示模块所使用的缺省等待时间是相当慷慨相比,在Linux/Unix对方:

maxinterval

秒(实数),将花费 睡眠的最大数量。默认值是60,这意味着File :: Tail永远不会花费超过 六十秒而不检查文件。

间隔

的秒(实数),其将用于 睡眠,首先检查该文件之前的初始数。默认值为10秒, 意思是File :: Tail会休眠10秒,然后确定文件中如何出现许多新行。

如果你运行你的程序,你的File::Tail对象确实发生得到初始化你开始写入文件之前,那么你可能要等上一段时间(10秒),你看到你的控制台上的任何东西之前。

+0

在文档中未找到如何更改间隔(即初始秒数)。我们有没有可能做这个改变的机会?顺便说一句,这是正确的,它需要很长的文件:尾巴初始化尾巴。我一直想知道为什么...... :-) – Paul

+0

从文档看来,您可以在调用'new()'时为这些(和其他)参数传递自定义值。例如:'$ file = File :: Tail-> new(name => $ name,maxinterval => 300);'...希望有帮助! :) –