参考: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]
$ 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内核数+n
和CPU内核数-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]