【Shell循环进程并行处理】利用简单的语句实现for循环并行处理命令
在生信分析中,经常会遇到不同的重复和处理,这样的分析过程有时是非常费时且占用资源并不是很多的,可以同时在后台运行以节约时间,这是并行处理的意义。除了需要并行处理,循环迭代来遍历整个文件夹的需要分析的数据也是非常消耗精力和时间的,按照宁可花费机器一分钟绝不浪费程序员一秒钟的精神,我决定开始探索并行循环处理的应用。
首先摆在我面前的是tab分割的按行分布的不同的采样策略,这样一个文件我们要进行分析的话就需要每次都迭代一下,这样非常费事,所以我们决定按行来拆分这样的文件,用到了split命令,见另述。拆分过后每个文件都是一行,这样对我们迭代就有利了。
并行处理用到了一个非常简单的形式,如下面的代码:
#!/bin/bash start=`date +%s` #定义脚本运行的开始时间 for ((i=1;i<=1000;i++)) do { sleep 1 #sleep 1用来模仿执行一条命令需要花费的时间(可以用真实命令来代替) echo 'success'$i; }& #用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行 #一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了 #循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理 #这些任务 done wait #wait命令的意思是,等待(wait命令)上面的命令(放入后台的)都执行完毕了再 #往下执行。 #在这里写wait是因为,一条命令一旦被放入后台后,这条任务就交给了操作系统 #shell脚本会继续往下运行(也就是说:shell脚本里面一旦碰到&符号就只管把它 #前面的命令放入后台就算完成任务了,具体执行交给操作系统去做,脚本会继续 #往下执行),所以要在这个位置加上wait命令,等待操作系统执行完所有后台命令 end=`date +%s` #定义脚本运行的结束时间 echo "TIME:`expr $end - $start`"
重点在于在循环结构里引入{}和&来并发执行这些for循环的语句,从而达到并行计算的目的。
以上代码引自:https://blog.csdn.net/dubendi/article/details/78931979
感谢分享