我正在研究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
仅捕获在初始化之后发生的文件的更改,因此可能看起来根本没有发生任何事情 .最后,您可能认为
File::Tail
与Linux / Unixtail
类似,但documentation表明模块使用的默认等待时间与Linux / Unix相比相当慷慨:如果您运行程序,并且在开始写入文件之前确实初始化了
File::Tail
对象,那么在您在控制台上看到任何内容之前,您可能需要等待一段时间(10秒) .