linux下的parallel:强大的并行

使用示例

如果你有并行需求,就安装和学习下面最基本的示例命令,其他的参数暂不学习即可。

 for f in `ls /public/project/RNA/airway/raw_fq/*gz` ; do echo "name=`basename $f .gz`; gunzip -c $f >~/\$name"; done |parallel -j 2

# 循环的并行:随便你想几个并行
# 无需通过拆文件、用shell的循环来做,或者条件判断等

安装

非管理员安装命令,下载二进制的包

# https://www.gnu.org/software/
# https://www.gnu.org/manual/manual.html
# https://www.gnu.org/software/parallel/
# http://ftp.gnu.org/gnu/parallel/
wget -c https://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2 
tar -jxvf parallel-latest.tar.bz2
cd parallel-20190622
cat README
mkdir $HOME/parallel
./configure --prefix=$HOME/parallel&& make && make install
# $HOME/parallel/自定义安装路径

$HOME/parallel/bin/parallel --help

make后显示如下

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether ln -s works... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
make  all-recursive
make[1]: Entering directory '/home/qmcui/parallel-20190622'
Making all in src
make[2]: Entering directory '/home/qmcui/parallel-20190622/src'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/qmcui/parallel-20190622/src'
make[2]: Entering directory '/home/qmcui/parallel-20190622'
make[2]: Leaving directory '/home/qmcui/parallel-20190622'
make[1]: Leaving directory '/home/qmcui/parallel-20190622'
Making install in src
make[1]: Entering directory '/home/qmcui/parallel-20190622/src'
make[2]: Entering directory '/home/qmcui/parallel-20190622/src'
 /bin/mkdir -p '/home/qmcui/parallel/bin'
 /usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.mksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/home/qmcui/parallel/bin'
make  install-exec-hook
make[3]: Entering directory '/home/qmcui/parallel-20190622/src'
rm /home/qmcui/parallel/bin/sem || true
rm: cannot remove '/home/qmcui/parallel/bin/sem': No such file or directory
ln -s parallel /home/qmcui/parallel/bin/sem
make[3]: Leaving directory '/home/qmcui/parallel-20190622/src'
 /bin/mkdir -p '/home/qmcui/parallel/share/doc/parallel'
 /usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf parallel_cheat.pdf '/home/qmcui/parallel/share/doc/parallel'
 /bin/mkdir -p '/home/qmcui/parallel/share/man/man1'
 /usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/home/qmcui/parallel/share/man/man1'
 /bin/mkdir -p '/home/qmcui/parallel/share/man/man7'
 /usr/bin/install -c -m 644 parallel_tutorial.7 parallel_book.7 parallel_design.7 parallel_alternatives.7 '/home/qmcui/parallel/share/man/man7'
make[2]: Leaving directory '/home/qmcui/parallel-20190622/src'
make[1]: Leaving directory '/home/qmcui/parallel-20190622/src'
make[1]: Entering directory '/home/qmcui/parallel-20190622'
make[2]: Entering directory '/home/qmcui/parallel-20190622'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/qmcui/parallel-20190622'
make[1]: Leaving directory '/home/qmcui/parallel-20190622'

parallel --help

Usage:

parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))...
cat ... | parallel --pipe [options] [command [arguments]]

-j n            Run n jobs in parallel
-k              Keep same order
-X              Multiple arguments with context replace
--colsep regexp Split input on regexp for positional replacements
{} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings
{3} {3.} {3/} {3/.} {=3 perl code =}    Positional replacement strings
With --plus:    {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} =
                {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}

-S sshlogin     Example: foo@server.example.com
--slf ..        Use ~/.parallel/sshloginfile as the list of sshlogins
--trc {}.bar    Shorthand for --transfer --return {}.bar --cleanup
--onall         Run the given command with argument on all sshlogins
--nonall        Run the given command with no arguments on all sshlogins

--pipe          Split stdin (standard input) to multiple jobs.
--recend str    Record end separator for --pipe.
--recstart str  Record start separator for --pipe.

See 'man parallel' for details

Academic tradition requires you to cite works you base your article on.
If you use programs that use GNU Parallel to process data for an article in a
scientific publication, please cite:

  O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881,
  DOI https://doi.org/10.5281/zenodo.1146014

This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.

配置环境变量

vim ~/.bashrc
export PATH=/home/qmcui/parallel/bin:$PATH
. ~/.bashrc

除去parallel的提示

这一步不必须,不太懂代码的,不要乱改,这一步忽略。

vim $HOME/parallel/bin/parallel     # 或者vim parallel 
# 作如下处理,避免每次运行都要出这个命令的提示信息
# 删掉后保存命令文档
image.png
image.png

示例

//www.greatytc.com/p/cc54a72616a1

$ parallel echo ::: a b c d e | tee a.txt
a
b
c
d
e

$ parallel echo ::: A B C ::: D E F | tee b.txt
A D
A E
A F
B D
B E
B F
C D
C E
C F

$ parallel echo ::: a b c d e|tee a.txt
a
b
c
d
e
qmcui 12:23:41 ~/parallel/bin
$  parallel -a a.txt -a b.txt echo
a A D
a A E
a A F
a B D
a B E
a B F
a C D
a C E
a C F
......
e C E
e C F
# 同:cat a.txt |parallel -a - -a b.txt echo
# -标准输入符,缓存占位符
# 同:cat a.txt | parallel echo :::: - b.txt
# 同: parallel echo ::: a b c d e :::: b.txt 

# GNU Parallel使用 --no-run-if-empty 来跳过空行:
qmcui 12:32:43 ~/parallel/bin
$ (echo 1; echo; echo 2) | parallel --no-run-if-empty echo
1
2
qmcui 12:32:45 ~/parallel/bin
$ (echo 1; echo; echo 2) | parallel echo
1

2

参数解释

Usage:

parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))...
cat ... | parallel --pipe [options] [command [arguments]]

常用选项:
::: 后面接参数
:::: 后面接文件
-j、--jobs   并行任务数
-N  每次输入的参数数量
--xargs会在一行中输入尽可能多的参数
-xapply 从每一个源获取一个参数(或文件一行)
--header  把每一行输入中的第一个值做为参数名
-m   表示每个job不重复输出“背景”(context)
-X   与-m相反,会重复输出“背景文本”
-q  保护后面的命令
--trim  lr 去除参数两头的空格,只能去除空格,换行符和tab都不能去除
--keep-order/-k   强制使输出与参数保持顺序 --keep-order/-k
--tmpdir/ --results   都是保存文件,但是后者可以有结构的保存
--delay  延迟每个任务启动时间
--halt  终止任务
--pipe    该参数使得我们可以将输入(stdin)分为多块(block)
--block  参数可以指定每块的大小

常用:
work.sh里,每一行都可以复制出在linux命令行运行的,全部写入文本work.sh。不需要执行权限。
好处是不用split切割并投,从而也不会每个运行脚本之间有的先结束有的后结束。

cat work.sh|parallel -j 4
# 4个任务并行

学习资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350