Multithreading Perl:错误处理线程

Multithreading Perl:错误处理线程,multithreading,perl,Multithreading,Perl,我来自Python。是否有类似于try/的东西,但在$thr->运行时我可以使用 因为我在worker中退出1,所以我得到: sub worker { exit 1; } my $thr = threads->create(\&worker); while ($thr->is_running()) { print "running\n"; } my $rc = $thr->join(); exit $rc; 我希望能够捕获工作人员可能出现的出

我来自Python。是否有类似于try/的东西,但在$thr->运行时我可以使用

因为我在worker中退出1,所以我得到:

sub worker {
    exit 1;
}

my $thr = threads->create(\&worker);    
while ($thr->is_running()) {
    print "running\n";
}
my $rc = $thr->join();
exit $rc;
我希望能够捕获工作人员可能出现的出口或其他编译错误

Perl exited with active threads:
0 running and unjoined
1 finished and unjoined       
0 running and detached                                                                                      
输出:

use strict;
use warnings;
use threads;

sub worker {
    my $bad = 1/0;
}

my $thr = threads->create( \&worker );
while ( $thr->is_running() ) {
    sleep 1;
}
my $rc = $thr->join();  #NB - RC will be 'undef' because there's no return.
有可能捕捉到错误吗?如何以及在哪里


不要在线程中调用exit。这就退出了你的整个计划。线程->退出是您想要的。 线程->退出

如果需要,可以随时通过调用threads->exit退出线程。这将导致线程在标量上下文中返回undef,或在列表上下文中返回空列表。 从主线程调用时,其行为与exit0相同

join等待线程完成

不要使用$a。无论如何,它是一个不好的变量名,但它也用于perl排序

您正在捕获$rc,但这意味着您的线程将返回。正如它所说,它将是未定义的

但这将起作用:

Thread 1 terminated abnormally: Illegal division by zero at mythread.pl line 6.
在后一种情况下,$rc是未定义的,因为您已退出。如果想要捕获异常出口,可以测试它是否未定义。只要确保你在成功的时候确实回报了一些东西

或者,用eval将代码包装在线程中,因为这不会是致命错误。不会经常出现,但我建议您与其尝试捕获广泛的可能致命错误,不如只测试它是否成功完成

要回答您的第二个问题,可以这样回答:

use strict;
use warnings;
use threads;

sub worker {
    sleep 10;
    threads->exit;
}

my $thr = threads->create( \&worker );
while ( $thr->is_running() ) {
    print $thr ->tid, " running\n";
    sleep 1;
}
print $thr ->tid, " not running\n";
sleep 5;
my $rc = $thr->join();  #NB - RC will be 'undef' because there's no return.

不要在线程中调用exit。这就退出了你的整个计划。线程->退出是您想要的。 线程->退出

如果需要,可以随时通过调用threads->exit退出线程。这将导致线程在标量上下文中返回undef,或在列表上下文中返回空列表。 从主线程调用时,其行为与exit0相同

join等待线程完成

不要使用$a。无论如何,它是一个不好的变量名,但它也用于perl排序

您正在捕获$rc,但这意味着您的线程将返回。正如它所说,它将是未定义的

但这将起作用:

Thread 1 terminated abnormally: Illegal division by zero at mythread.pl line 6.
在后一种情况下,$rc是未定义的,因为您已退出。如果想要捕获异常出口,可以测试它是否未定义。只要确保你在成功的时候确实回报了一些东西

或者,用eval将代码包装在线程中,因为这不会是致命错误。不会经常出现,但我建议您与其尝试捕获广泛的可能致命错误,不如只测试它是否成功完成

要回答您的第二个问题,可以这样回答:

use strict;
use warnings;
use threads;

sub worker {
    sleep 10;
    threads->exit;
}

my $thr = threads->create( \&worker );
while ( $thr->is_running() ) {
    print $thr ->tid, " running\n";
    sleep 1;
}
print $thr ->tid, " not running\n";
sleep 5;
my $rc = $thr->join();  #NB - RC will be 'undef' because there's no return.

为什么线程需要退出?您应该使用return退出线程。@这是一个示例,因此我可以显示错误。如果我把$a=0放在没有我的或其他东西的地方,它也会这样做。关键是我想捕捉在线程编译错误中可能看到的任何错误,这些错误是完全不同的。如果脚本不能完整编译,它将根本无法运行。另外,您还选择了一个$a=0的坏例子,它是唯一一个在没有my的情况下可以正常工作的变量,不管是什么情况。这不是问题的关键。我希望能够处理工作线程中可能发生的任何错误。如果出现编译错误,它将不会运行线程或其他任何操作。所以,是的,这是关键。任何正常错误都不需要特殊处理。为什么线程需要退出?您应该使用return退出线程。@这是一个示例,因此我可以显示错误。如果我把$a=0放在没有我的或其他东西的地方,它也会这样做。关键是我想捕捉在线程编译错误中可能看到的任何错误,这些错误是完全不同的。如果脚本不能完整编译,它将根本无法运行。另外,您还选择了一个$a=0的坏例子,它是唯一一个在没有my的情况下可以正常工作的变量,不管是什么情况。这不是问题的关键。我希望能够处理工作线程中可能发生的任何错误。如果出现编译错误,它将不会运行线程或其他任何操作。所以,是的,这是关键。任何正常错误都不需要特殊处理。我做了你的测试,我有一个问题。这是我刚才用插图补充回答的原始问题的一部分。不要在你的帖子中称为退出。这就退出了你的整个计划。线程->退出是您想要的。完整地说,应该注意,您可以使用threads'exit'=>'threads\u only',它将指示线程将任何退出视为仅结束线程,而不是整个程序。看,我做了你的测试,我有一个问题。这是我刚才用插图补充回答的原始问题的一部分。不要在你的帖子中称为退出。这就退出了你的整个计划。线程->退出是您想要的。完整地说,你应该注意到 n使用threads'exit'=>'threads_only',它将指示线程将任何退出视为仅结束线程,而不是结束整个程序。见