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