Perl:多线程写和尾文件



我正在研究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秒)才能在控制台中看到任何内容。

最新更新