我正在研究perl多线程的一个简单用例:一个线程写文件,另一个线程跟踪文件。下面是代码:
<>之前使用严格的;使用警告;使用线程;使用文件::尾巴;My $file = 'data.txt';子tail_file {我$ =文件::尾巴->新(文件);While (define (my $line=$file->read)) {打印"美元行";}}子write_file {打开MYFILE, ">> $file");打印MYFILE标量本地时间。一个数据。 n";关闭(MYFILE);打印'write done!';}My $t_tail = threads->new(&tail_file);t_tail ->加入();My $t_write = threads->new(&write_file);t_write ->加入();之前运行时,这个程序卡在控制台上。
如果去掉对$t_tail->join()
的调用,您的程序实际上工作得很好。您需要摆脱这个调用,因为您的$t_tail
线程将永远运行(因此永远不会运行join
),并且您的$t_write
线程将永远不会被踢开。
$t_write
线程在$t_tail
线程之前执行(因为线程的执行顺序从来没有保证过),那么你可能在File::Tail
对象初始化之前完成了对文件的写入。由于File::Tail
只捕获在初始化之后发生的对文件的更改,因此看起来好像什么都没有发生。
最后,您可能认为File::Tail
的工作方式类似于Linux/Unix的tail
,但是文档显示,与Linux/Unix的对应模块相比,该模块使用的默认等待时间相当慷慨:
maxinterval
花费的最大秒数(实数)睡觉。默认值是60,这意味着File::Tail的开销永远不会超过60秒不检查文件
将花费的初始秒数(实数)在文件第一次被检查之前,处于睡眠状态。默认是10秒,File::Tail将休眠10秒,然后确定如何文件中出现了许多新行。
如果您运行您的程序,并且您的File::Tail
对象恰好在您开始写入文件之前被初始化,那么您可能需要等待一段时间(10秒)才能在控制台中看到任何内容。