2010-12-16 156 views
2

我需要並行運行兩個perl腳本。我怎樣才能做到這一點?如何從父級命令並行運行兩個子命令?

目前,我有

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

命令的文件按順序執行,直至command1.pl完成command2.pl將無法運行。

我想同時運行這兩個命令。

請幫助!

回答

6

`perl command1.pl &`;

`perl command2.pl &`;

..或者使用Perl叉()函數

的perldoc -f叉

..或者使用Perl穿線

的perldoc線程

或者理由T選用一個shell腳本:

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

我會解決反向系統()調用。無論如何。 – DVK 2010-12-16 21:10:30

+0

系統調用調用「exec」 - 不會被shell解釋。它是解釋「&」並在後臺運行的shell,因此係統無法工作。 – Brad 2010-12-16 21:12:06

+2

不正確:'系統'可能會或可能不會調用shell來解析參數,具體取決於您傳遞了多少個參數。另外IPC :: System :: Simple也有一些強制調用(或不調用)shell的方法。 – Ether 2010-12-16 22:32:06

0

取決於命令解釋器。在Windows中,您可以使用start命令啓動進程而不用等待。在我記得的大多數* nix命令解釋器中,相關記法是在命令末尾添加&符號&

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); 
} 

(如果你確實在意輸出,然後撥叉然後反撥?)

或者使用線程(我對這個例子並不感到自豪,我甚至還沒有寫過它。查找使用線程隊列::東西更可怕的一個例子)

use threads; 

my @threads; 

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

$_->join for @threads; 

還有幾個模塊幫你出這一個,比如Parallel::ForkManagerWin32::Job