我正在研究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();
运行时,此程序卡在控制台上。
答案 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秒)才能在控制台上看到任何内容。