perl:多线程写入和尾文件

Posted

技术标签:

【中文标题】perl:多线程写入和尾文件【英文标题】:perl: multithread write and tail file 【发布时间】:2011-12-31 21:25:25 【问题描述】:

我正在研究一个简单的 perl 多线程用例:一个线程写入文件,另一个线程跟踪文件。这是代码:

使用严格; 使用警告; 使用线程; 使用文件::尾; 我的 $file = 'data.txt'; 子尾文件 我的 $file=File::Tail->new($file); 而(定义(我的 $line=$file->read)) 打印“$行”; 子写入文件 打开 (MYFILE, ">> $file"); 打印 MYFILE 标量 localtime 。 " 一个数据。\n"; 关闭(我的文件); print '写完!'; 我的 $t_tail = 线程->new(\&tail_file); $t_tail->join(); 我的 $t_write = 线程->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/Unix 的 tail 类似,但 documentation 表明该模块使用的默认等待时间与 Linux/Unix 对应的模块相比相当大:

最大间隔

将花费的最大秒数(实数) 睡眠。默认值为 60,这意味着 File::Tail 永远不会花费超过 六十秒不检查文件。

间隔

将花费的初始秒数(实数) 睡眠,在第一次检查文件之前。默认为十秒, 意思是 File::Tail 会休眠 10 秒,然后确定,如何 文件中出现了许多新行。

如果您运行程序,并且您的 File::Tail 对象确实在您开始写入文件之前被初始化,那么您可能需要等待一段时间(10 秒)才能在控制台上看到任何内容。

【讨论】:

在文档中没有找到如何更改间隔(即初始秒数)。我们有机会做改变吗?顺便说一句,File:Tail 需要很长时间才能初始化为尾部是正确的。我一直想知道为什么... :-) 从文档看来,您可以在调用 new() 时为这些(和其他)参数传递自定义值。例如:$file=File::Tail->new(name=>$name, maxinterval=>300); ...希望对您有所帮助! :)

以上是关于perl:多线程写入和尾文件的主要内容,如果未能解决你的问题,请参考以下文章

多线程文件写同一个文件写不进去

windows环境,多线程情况下,C语言向文件写入数据。

perl 的多线程与多进程

[ Perl ] 多线程 并发编程

Perl多线程:解释器线程的特性

2.Perl 多线程:Threads(线程返回值)