【问题标题】:timeout for threads in perlperl 中的线程超时
【发布时间】:2014-06-23 06:03:29
【问题描述】:

我正在编写一个 perl 脚本以在 5 秒后退出线程,如下所示。但我无法从 if 条件打印消息。

脚本的输出是闹钟

当线程超时时如何从父进程打印正确的错误消息。

#!/usr/bin/perl
use strict;
use warnings;
use threads;

my $th   = threads->create( \&sub1 );
my $thid = $th->tid();

eval
{
    $SIG{'KILL'} = sub
    {
        if ( $th->is_running() )
        {
            print "timed out, exiting the thread $thid\n";
            $th->exit();
        }
    };
    alarm(5);
    $th->join();
};

sub sub1
{
    my $i = 0;
    while ( $i == 0 )
    {
    }

}

【问题讨论】:

    标签: multithreading perl


    【解决方案1】:

    Documentation says

    如果您想使用警报来使系统调用超时,您需要使用 eval/die 对。

    或者,您可以使用 Sys::SigAction 并执行以下操作

    use Sys::SigAction qw( timeout_call );
    if ( timeout_call( 5 ,sub { $retval = DoSomething( @args ); } )
    {
       print "DoSomething() timed out\n" ;
    }
    

    编辑:查看 mob 对问题的回答:Perl threads with alarm

    另见thread safe alarms上的讨论。

    【讨论】:

    • Sys::SigAction 在单线程 perl 应用程序中使用多线程支持构建的 perls 上工作得很好,它不支持多线程应用程序
    • 然后进行 eval/die。请参阅此处的示例:perldoc.perl.org/functions/alarm.html 还检查编辑的答案。
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2016-12-20
    • 2011-06-21
    • 2018-04-01
    相关资源
    最近更新 更多