我在perl中使用了Thread::Pool模块来并行化一些perl代码。这个过程需要一段时间,偶尔我会用SIGINT从命令行中终止它。正如我所料,这样做会导致程序突然结束。这留下了一些凌乱的临时文件,所以我想安装一个信号处理程序。我这样做:螺纹perl和信号处理程序
sub INT_Handler{
#clean up code
exit(1);
}
$SIG{'INT'} = 'INT_handler';
在创建线程池和启动线程之前。现在,当我发送正在运行的SIGINT,worker threads,但池会立即启动另一组工作人员处理下一组作业并继续运行。为什么在信号处理程序中退出的调用不会退出主线程?我需要什么来阻止该进程运行?
编辑响应暴民的评论
**进一步编辑**
这里是我写了一个例子。
use Thread::Pool;
sub INT_handler{
print "Handler\n";
exit(1);
}
$SIG{'INT'}='INT_handler';
sub f{
print "Started a thread " . rand(10000) . "\n";
sleep(10);
}
my $pool;
my $submit = \&f;
if (0){
$pool = Thread::Pool->new({do=>'f', workers=>5});
$submit = sub{ $pool->job; }
}
for (my $i = 0; $i < 100; $i++){ $submit->(); }
$pool->shutdown if defined $pool;
与0,我看到预期的结果
h:57 Sep 15 16:15:19> perl tp.pl
Started a thread 3224.83224635111
Handler
但1,出现这种情况
h:57 Sep 15 16:14:56> perl tp.pl
Started a thread 5034.63673711853
Started a thread 9300.99967009486
Started a thread 1394.45532885478
Started a thread 3356.0428193687
Started a thread 1424.4741558014
等和处理程序没有得到进入和进程继续运行。我不得不用SIGINT以外的信号杀死进程。如果没有处理程序,这两种情况都会在通过SIGINT时退出。
+1
这与[文档]争论(http://search.cpan.org/perldoc?threads#BUGS_AND_LIMITATIONS):“脚本的主线程(线程ID = 0)捕获*信号。 “你能隔离并发布一些代码,这些代码在工作线程中似乎被捕获到了吗? –
+0
@mob好的,所以我必须误认为信号被工作人员抓住了。我认为是这样,因为我明确地在信号处理程序中调用exit。然而,我观察到的是正在运行的工作者线程以及正在启动的一组新工人。 –