如何从父母一个并行运行两个子命令?

时间:2010-12-16 21:01:22

标签: perl

我需要并行运行两个perl脚本。我怎么能做到这一点?

目前,我有一个带

的文件
system("perl command1.pl command2.pl"); 

命令按顺序执行,直到command1.pl完成,command2.pl不会运行。

我想同时运行这两个命令。

请帮助!

4 个答案:

答案 0 :(得分:6)

  

`perl command1.pl&`;

     

`perl command2.pl&`;

..或使用perl fork()函数

  

perldoc -f fork

..或使用perl线程

  

perldoc线程

或者只使用shell脚本:

#!/bin/sh
./command1.pl &
./command2.pl &

答案 1 :(得分:0)

取决于命令解释器。在Windows中,您可以使用start命令直接启动进程而无需等待。在大多数* nix命令解释器中,我记得相关的表示法是在命令的末尾添加一个&符号&

答案 2 :(得分:0)

您可以使用piped open进程,ala

use 5.013;
use warnings;
use autodie;

open my $cmd1_fh, '-|', 'dir';
open my $cmd2_fh, '-|', 'cls';

或者,如果您不关心输出,fork然后exec

my @child_pids;
for my $cmd ('dir', 'cls') {
    defined(my $child_pid = fork()) or die "Couldn't fork: $!";
    if ($child_pid == 0) {
        exec $cmd;
    } else {
        push @child_pids, $child_pid;
    }
}

for my $pid (@child_pids) {
   waitpid($pid, 0);
}

(如果你关心输出,fork然后反击?)

或者使用线程(我并不为这个例子感到骄傲,我甚至还没有编写它。查看一个使用Thread :: Queue的例子,以获得更糟糕的东西)

use threads;

my @threads;

for my $cmd ('dir', 'cls') {
    push @threads, threads->create(sub { system @_ }, $cmd);
}

$_->join for @threads;

还有几个模块可以帮助您解决这个问题,例如Parallel::ForkManager Win32::Job

答案 3 :(得分:0)

根据您的技能水平和您想要做的事情,您可能会对POE::Wheel::Run感兴趣。