gpt4 book ai didi

multithreading - 线程 perl 和信号处理程序

转载 作者:行者123 更新时间:2023-12-04 04:28:38 27 4
gpt4 key购买 nike

我正在使用 Thread::Pool perl 中的模块来并行化一些 perl 代码。这个过程需要一段时间,偶尔我会用 SIGINT 从命令行终止它。 .如我所料,这样做会导致程序突然结束。这留下了一些凌乱的临时文件,所以我想安装一个信号处理程序。我这样做了:

sub INT_Handler{
#clean up code
exit(1);
}
$SIG{'INT'} = 'INT_handler';

在创建线程池和启动线程之前。现在当我发送 SIGINT , worker threads正在运行的进程死了,但池会立即启动另一组工作进程来处理下一组作业并继续运行。为什么在信号处理程序中调用 exit 不退出主线程?我需要什么来停止进程运行?

根据暴徒的评论进行编辑

** 进一步编辑 **

这是我写的一个例子。

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 时简单地退出。 .

最佳答案

这更像是一个提示而不是一个明确的答案,但看起来您的主线程永远不会处于运行信号处理程序的“安全”状态。当您启用 Perl 的不安全信号时它确实有效:

PERL_SIGNALS=unsafe perl tp.pl

参见 perlipc有关安全和不安全信号的更多信息 - 也许它会引导您朝着正确的方向使用安全信号实现它(因为它可能应该如此)。


(由 mob 更新)基于 Michal 的原始见解,此变通方法 Perl::Unsafe::Signals还可以让处理程序按照您的预期工作

use Perl::Unsafe::Signals;
...
UNSAFE_SIGNALS {
$pool->shutdown if defined $pool;
};

很明显,Perl 的安全信号机制会干扰信号到达处理程序的过程。我想知道是否可以通过在 Thread::Pool::shutdown 中放置一个 UNSAFE_SIGNALS { ... } block 来解决这个问题。无论哪种方式,我都会 file a bug report关于这个。

关于multithreading - 线程 perl 和信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com