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:多线程写入和尾文件的主要内容,如果未能解决你的问题,请参考以下文章