[英]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.