簡體   English   中英

perl:多線程寫和尾文件

[英]perl: multithread write and tail file

我正在研究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();

運行時,該程序卡在控制台上。

如果你擺脫了對$t_tail->join()的調用,你的程序實際上工作正常。 你需要擺脫這個調用,因為你的$t_tail線程將永遠運行(因此永遠不會join ),你的$t_write線程將永遠不會被啟動。

然而,你應該知道的是,即使你擺脫這一行的,如果$t_write線程之前執行$t_tail線程(因為使用線程是永遠不會保證執行順序),那么它可能是你寫完的情況下, File::Tail對象之前的File::Tail甚至被初始化。 而且由於File::Tail只捕獲初始化發生的文件更改,因此看起來根本沒有任何事情發生。

最后,你可能會認為File::Tail的工作方式類似於在Linux / Unix tail ,但文件表明,該模塊使用的缺省等待時間相比,在Linux / Unix對口相當慷慨:

maxinterval

睡眠所花費的最大秒數(實數)。 默認值為60,這意味着File :: Tail在不檢查文件的情況下永遠不會花費超過60秒。

間隔

首次檢查文件之前將花費的初始秒數(實數)。 默認值為10秒,這意味着File :: Tail將休眠10秒鍾,然后確定文件中出現了多少新行。

如果您運行程序,並且在開始寫入文件之前確實初始化了File::Tail對象,那么在控制台上看到任何內容之前,您可能需要等待一段時間(10秒)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM