2011-11-18 22 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);'...希望有幫助! :) –