在后台运行进程而不被init,Perl采用

时间:2014-08-21 15:59:55

标签: perl parallel-processing

如果我通过perl程序运行外部进程,perl程序将仍然是进程的父进程。简化流程管理。

system('sleep 3000'); # perl is still the parent

但是,如果我尝试在后台运行该过程,以便程序不必等待进程退出...

system('sleep 3000 &'); 

sleep进程将被系统init进程采用,并且不再与执行它的程序相关联。

在这种情况下处理流程管理的正确方法是什么。我如何模拟在后台运行流程但保持流程祖先?

2 个答案:

答案 0 :(得分:2)

您可以使用threads

use threads;
my $t = async { system('sleep 3000'); };

# do something in parallel ..

# wait for thread to finish 
$t->join;

fork

sub fasync(&) {
  my ($worker) = @_;

  my $pid = fork() // die "can't fork!"; 
  if (!$pid) { $worker->(); exit(0); }

  return sub {
    my ($flags) = @_;
    return waitpid($pid, $flags // 0);
  }
}

my $t = fasync { system('sleep 3000'); };

# do something in parallel ..

# wait for fork to finish 
$t->();

答案 1 :(得分:0)

fork / exec和wait()。

Fork通过创建父进程的副本来创建子进程,父进程接收子进程的id,并对子进程id调用wait()。

同时,子进程使用exec()来覆盖自己(父进程的副本)和你想要执行的进程。

如果您需要多个并发后台作业,我建议Parallel::ForkManager