我需要並行運行兩個perl腳本。我怎樣才能做到這一點?如何從父級命令並行運行兩個子命令?
目前,我有
system("perl command1.pl command2.pl");
命令的文件按順序執行,直至command1.pl完成command2.pl將無法運行。
我想同時運行這兩個命令。
請幫助!
我需要並行運行兩個perl腳本。我怎樣才能做到這一點?如何從父級命令並行運行兩個子命令?
目前,我有
system("perl command1.pl command2.pl");
命令的文件按順序執行,直至command1.pl完成command2.pl將無法運行。
我想同時運行這兩個命令。
請幫助!
`perl command1.pl &`;
`perl command2.pl &`;
..或者使用Perl叉()函數
的perldoc -f叉
..或者使用Perl穿線
的perldoc線程
或者理由T選用一個shell腳本:
#!/bin/sh
./command1.pl &
./command2.pl &
取決於命令解釋器。在Windows中,您可以使用start
命令啓動進程而不用等待。在我記得的大多數* nix命令解釋器中,相關記法是在命令末尾添加&符號&
。
你可以使用一個piped open的過程中,ALA
use 5.013;
use warnings;
use autodie;
open my $cmd1_fh, '-|', 'dir';
open my $cmd2_fh, '-|', 'cls';
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::ForkManager和Win32::Job。
根據你的技能水平和你想做什麼,你可能會對POE::Wheel::Run感興趣。
我會解決反向系統()調用。無論如何。 – DVK 2010-12-16 21:10:30
系統調用調用「exec」 - 不會被shell解釋。它是解釋「&」並在後臺運行的shell,因此係統無法工作。 – Brad 2010-12-16 21:12:06
不正確:'系統'可能會或可能不會調用shell來解析參數,具體取決於您傳遞了多少個參數。另外IPC :: System :: Simple也有一些強制調用(或不調用)shell的方法。 – Ether 2010-12-16 22:32:06