don*_*rew 3 parallel-processing perl fork
当我杀死使用ForkManager的perl进程时,我希望所有子进程都死掉.在下面的代码中,如果我运行它并在睡眠行运行时按ctrl+ c,print则会终止睡眠过程,但是在脚本结束之前所有行都会同时执行.理想情况下,我想要一个中断立即停止所有执行.我能做什么?
#!/usr/bin/perl -w
use Parallel::ForkManager;
main {
my $fork1 = new Parallel::ForkManager(8);
while (1) {
$fork1->start and next;
system("sleep 15s");
print "Still going!"
$fork1->finish;
}
fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)
根据perldoc system,system实际上忽略了SIGINT和SIGQUIT:
由于在执行系统期间忽略了SIGINT和SIGQUIT,如果您希望程序在收到这些信号后终止,则需要根据返回值自行安排.
因此,如果您希望在system调用期间SIGINT时您的进程停止执行,则需要自己实现该逻辑:
#!/usr/bin/perl -w
use Parallel::ForkManager;
main {
my $fork1 = new Parallel::ForkManager(8);
while (1) {
$fork1->start and next;
print "Sleeping...";
system("sleep 15s") == 0 or exit($?);
print "Still going!";
$fork1->finish;
}
fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)
或者更合理的方法是使用Perl内置sleep:
#!/usr/bin/perl -w
use Parallel::ForkManager;
main {
my $fork1 = new Parallel::ForkManager(8);
while (1) {
$fork1->start and next;
print "Sleeping...";
sleep 15;
print "Still going!";
$fork1->finish;
}
fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |