据 LUG 里比较专业的 Linuxer 介绍,多开几个终端,不能自动的分配核。 另外,不并行完成一个程序所用时间除以并行完成所用的时间之商与计算机核数相等是并行优化的极限。

xargs

xargs 不需要自己安装,这么使用:

cat cmd | tr '\n' '\0' | xargs -P 8 -0 -n1  bash -c

把需要执行的命令写到 cmd 文件里,cmd 文件内的每一行命令会被分配一个核进行计算,8 的意思是最多同时运行 8 个进程。一定要确保 cmd 文件里每一行的命令是相互独立的,因为它们的计算顺序将不得而知。

perl 模块

调用模块:

use Parallel::ForkManager;

这样使用:

my $pm = Parallel::ForkManager->new(8);
grn_LOOP:
foreach my $ cmd (@cmd) {
    my $pid = $pm->start and next grn_LOOP;
    system "$cmd";
    $pm->finish;
}
$pm->wait_all_children;

每一个循环分配一个进程,最多分配 8 个。

GNU parallel

执行这个命令安装:

(wget -O - pi.dk/3 || curl pi.dk/3/) | bash

这么使用:

parallel  --max-procs 8 echo {} ::: "1 7" "8 14" "15 21" "22 28"

这个命令会让 echo 并行执行。8 是指最多的计算机核数,“1 7” 这些是传给echo的参数。 我试验的情况是,“1 7” 是作为一个参数传入的,而不是两个。 所以如果你用的是perl:

parallel  --max-procs 8 'perl nll.pl' {} ::: "events 2 2"

这里,perl会认为你传入的是一个参数,内容是 “events空格2空格2” ,而不是 3 个。 目前,除了改 perl 脚本我还不知道这如何处理。