Как запустить параллельно две дочерние команды от родительской? - PullRequest
2 голосов
/ 17 декабря 2010

Мне нужно запустить два сценария perl из одного параллельно.Как я могу это сделать?

В настоящее время у меня есть файл с

system("perl command1.pl command2.pl"); 

Команды выполняются последовательно и до тех пор, пока не будет завершен command1.pl command2.pl не будет выполняться.

Я хотел бы запустить две команды одновременно.

ПОЖАЛУЙСТА, ПОМОГИТЕ!

Ответы [ 4 ]

6 голосов
/ 17 декабря 2010

`perl command1.pl &`;

`perl command2.pl &`;

.. или используйте функцию perl fork ()

perldoc -f fork

.. или используйте потоки perl

потоки perldoc

Или просто используйте сценарий оболочки:

#!/bin/sh
./command1.pl &
./command2.pl &
0 голосов
/ 17 декабря 2010

В зависимости от вашего уровня квалификации и того, что вы хотите сделать, вас может заинтересовать POE :: Wheel :: Run .

0 голосов
/ 17 декабря 2010

Вы могли бы использовать открытое по трубопроводу для процесса, 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);
}

(Если вам небезразличен вывод, ответвление, а затем обратная связь?)

Или использовать потоки (я не горжусь этим примероми я еще даже не написал. Посмотрите пример, использующий 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 .

0 голосов
/ 17 декабря 2010

Зависит от интерпретатора команд.В Windows вы используете команду start, чтобы просто запустить процесс без ожидания.В большинстве интерпретаторов команд * nix, насколько я помню, соответствующим обозначением является добавление амперсанда & в конце команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...