我需要并行运行两个perl脚本。我怎么能做到这一点?
目前,我有一个带
的文件system("perl command1.pl command2.pl");
命令按顺序执行,直到command1.pl完成,command2.pl不会运行。
我想同时运行这两个命令。
请帮助!
答案 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';
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感兴趣。