【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

感謝分享


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM