【问题标题】:perl: multithread write and tail fileperl:多线程写入和尾文件
【发布时间】: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();

运行时,该程序卡在控制台上。

【问题讨论】:

    标签: multithreading perl


    【解决方案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); ...希望对您有所帮助! :)
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多