GNU parallel

参考:Tutorial, parallel 指南, parallel man & examples, parallel 示例,



在一台或多台计算机上并行运算可以充分利用CPU资源,提高工作效率,GNU parallel就是这样一个在shell下实现并行运算的命令行工具。

安装

$ wget http://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
$ tar -xvjf parallel-latest.tar.bz2 > parallel-files
$ cd parallel-files
$ ./configure && make && sudo make install

查看当前安装的GNU parallel版本:

$ parallel --version

注意:不要通过apt-get安装”GNU parallel”,默认通过apt-get安装的parallel并不是我们需要的工具。

[TOP]


输入

$ parallel echo ::: apple banana dog > FILE
$ cat FILE
apple
banana
dog
$ parallel -a FILE echo
apple
banana
dog
$ cat FILE | parallel echo
apple
banana
dog

上边列出了parallel的三种输入方式,第一种是借助:::直接从命令行输入,第二种通过-a FILE读入文件,也可以写为:::: FILE,第三种通过管道将标准输入传递给parallel:::::::parallel的分隔符,其作用类似于管道符|

这些输入方式可以混合使用,如:

$ parallel echo ::: apple banana dog :::: FILE
apple apple
apple banana
apple dog
banana apple
banana banana
banana dog
dog apple
dog banana
dog dog

parallel默认按行处理数据,即将一行作为一个参数,定界符为\n,使用-d可以改变定界符,如:

$ parallel -d : echo :::: /etc/passwd

在处理数据时,parallel可以指定不处理空行,如:

$ (echo apple; echo; echo dog) | parallel --no-run-if-empty echo
apple
dog

如果parallel没有给定命令,则:::后的参数会作为命令进行处理,如:

$ parallel ::: 'echo "hello world"' pwd ls
hello world
[当前目录路径]
[当前目录的文件列表]

[TOP]


占位符

占位符{}parallel中应用广泛,其用法多样,这里介绍最常用的几种:

$ parallel echo ::: path/name.c
path/name.c
$ parallel echo {} ::: path/name.c
path/name.c
$ parallel echo {.} ::: path/name.c
path/name #去掉扩展名
$ parallel echo {/} ::: path/name.c
name.c #去掉路径
$ parallel echo {//} ::: path/name.c
path #只保留路径
$ parallel echo {/.} ::: path/name.c
name #去掉路径和扩展名
$ parallel echo {#} ::: path/name.c
1 #输出任务编号
2
3

有多个输入源时,{n}用于指定输入源的参数,n可为负数,表示从后向前倒数。

$ parallel echo {1} and {2} ::: A B ::: C D
A and C
A and D
B and C
B and D

上述占位符的规则可以组合使用,如:

$ parallel echo ~/{1/} ::: path/name.c
/home/USER/name.c

[TOP]


类CSV数据导入

$ cat sample.csv
num business
6481    互联网
2363    计算机软件
1392    高新科技
1235    地产建筑
1221    高等教育

--colsep可以按照指定分隔符将文件切分为列,--header将csv的列名作为占位符的索引:

$ parallel --header : --colsep '\t' echo {business} :::: sample.csv
互联网
计算机软件
高新科技
地产建筑
高等教育

[TOP]


输出

并行任务的输出与输入的顺序不是完全对应的,如果需要保持和输入相同的顺序,可使用-k(--keep-order),也可以使用--tag为输出打上相应的“tag”:

$ parallel --tag --header : --colsep '\t' echo {2} :::: sample.csv
6481 互联网	   互联网
2363 计算机软件  计算机软件
1392 高新科技   高新科技
1235 地产建筑   地产建筑
1221 高等教育   高等教育

[TOP]


并发数

$ ls /etc/passwd | parallel -j2 wc -l {} | awk '{s+=$1} END {print s}'

-j(--jobs)用于指定并发数,后边的数字可以是一个数字n(0表示尽可能多的并发数),也可以是+n-n,分别表示CPU内核数+nCPU内核数-n,还可以是一个百分数n%,表示CPU内核数×n%

$ ls /etc/passwd | parallel --tmux -j2 wc -l {} | awk '{s+=$1} END {print s}'

--tmux可以在tmux窗口中输出每一个并发任务。注意:需要安装tmux。

$ parallel --timeout 4.5 sleep {}\; echo {} ::: 2 4 6 8
2
4

--timeout用于指定任务的过期延时,精度为2秒。

[TOP]