2010-12-16 8 views
2

Ich muss zwei Perl-Skripte von einem parallel ausführen. Wie kann ich das erreichen?Wie parallel zwei Kinder Befehl von einem Elternteil laufen?

Derzeit habe ich eine Datei mit

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

Befehle werden in der Reihenfolge ausgeführt und bis command1.pl command2.pl erfolgt wird nicht ausgeführt.

Ich möchte die beiden Befehle gleichzeitig ausführen.

BITTE HILFE!

Antwort

6

`perl command1.pl &`;

`perl command2.pl &`;

.or die perl fork() -Funktion

Perldoc -f fork

..oder Verwendung perl Einfädeln

Perldoc Gewinde

Oder jus t einen Shell-Skript verwenden:

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

Ich würde die Backticks zu System() Anruf beheben. +1 sowieso. – DVK

+0

Systemaufruf ruft einen "exec" auf - wird nicht von der Shell interpretiert. Es ist die Shell, die das "&" interpretiert und im Hintergrund läuft - also würde das System nicht funktionieren. – Brad

+2

inkorrekt: 'system' kann oder kann keine Shell zum Analysieren der Argumente aufrufen, abhängig davon, wie viele Argumente Sie übergeben haben. Auch IPC :: System :: Simple hat einige Methoden, die das Aufrufen der Shell erzwingen können. – Ether

0

Hängt vom Befehlsinterpreter ab. Unter Windows verwenden Sie den Befehl start, um einen Prozess ohne Warten zu starten. In den meisten * nix Befehlsdolmetschern, so wie ich mich an die relevante Notation erinnere, ist das Hinzufügen eines kaufmännischen Und-Zeichens & am Ende des Befehls.

0

Sie ein piped open den Prozess verwenden könnte, ala

use 5.013; 
use warnings; 
use autodie; 

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

Oder, wenn Sie nicht über den Ausgang egal, fork und dann 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); 
} 

(Wenn Sie sich um den Ausgang kümmern, Gabel und dann Backtick?)

Oder benutze Threads (Ich bin nicht stolz auf dieses Beispiel, und ich habe es noch nicht einmal geschrieben. Sehen Sie ein Beispiel mit Gewinde :: Queue für etwas viel weniger schrecklich)

use threads; 

my @threads; 

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

$_->join for @threads; 

Es gibt auch mehrere Module, die Ihnen mit diesem, wie Parallel::ForkManager und Win32::Job helfen.

0

Abhängig von Ihrem Qualifikationsniveau und was Sie tun möchten, könnten Sie interessiert sein POE::Wheel::Run.

Verwandte Themen