当我使用exit
或die
时,它会杀死整个程序。
foreach my $t (threads->list())
{
$t->exit;
$count++;
}
Usage: threads->exit(status) at main.pl line 265
Perl exited with active threads:
9 running and unjoined
0 finished and unjoined
0 running and detached
有什么想法吗?
答案 0 :(得分:7)
要忽略正在执行的线程,请返回控制并丢弃它可能输出的内容,正确的方法是detach
,而不是exit
。
请参阅perldoc perlthrtut
- Ignoring a Thread。
perldoc threads
解释了代码退出的原因:
threads->exit()
如果需要,可以随时通过调用退出一个线程
threads->exit()
。这将导致线程在a中返回undef 标量上下文,或列表上下文中的空列表。从来电时 main 线程,其行为与exit(0)
相同。
可能有办法实现instant termination(在Windows上对我不起作用):
use threads 'exit' => 'threads_only';
这会全局覆盖调用
exit()
的默认行为 在一个线程内,并有效地使这些调用行为相同 为threads->exit()
。换句话说,使用此设置,调用exit()
仅导致线程终止。因为它的全球性 效果,此设置不应在模块等内部使用。 主线程不受此设置的影响。
文档还提出了另一种方法,使用set_thread_exit_only
方法(再次,在Windows上对我不起作用):
$thr->set_thread_exit_only(boolean)
这可用于更改线程的仅退出线程行为 创建之后。有了真正的论证,
exit()
就会引起 只有退出的线程。如果有错误的论点,exit()
会 终止申请。主线程不受此调用的影响。
下面的示例使用了$unwanted
线程的signal to terminate:
use strict;
use warnings;
use threads;
my $unwanted = threads->create( sub {
local $SIG{KILL} = sub { threads->exit };
sleep 5;
print "Don't print me!\n";
} );
my $valid = threads->create( sub {
sleep 2;
print "This will print!\n";
} );
$unwanted->kill('KILL')->detach; # Kills $thr, cleans up
$valid->join; # sleep 2, 'This will print!'
答案 1 :(得分:3)
如果要杀死某个帖子,请使用$thread->kill
将其删除。如果您想要断开一个线程但让它保持运行,请使用$thread->detach
。 threads->exit
导致当前线程退出;它不会将线程视为调用者。
答案 2 :(得分:0)
错误消息告诉您$t->exit
需要参数。试着给它一个。 (perldoc Threads
似乎没有,但我不知道你正在使用什么包。)