Shell-使用和wait让你的脚本并行执行
文章目錄
- 概述
- 常見的串行執(zhí)行
- 使用&和wait改造
- 示例二
概述
我們知道shell中的命令都是串行執(zhí)行的,如果想要充分利用服務(wù)器的資源,就需要些小技巧了。
假定業(yè)務(wù)上多個(gè)業(yè)務(wù)邏輯沒有先后關(guān)系,每個(gè)腳本的執(zhí)行時(shí)間也很長 ,推薦并行執(zhí)行。
一般情況下,我們會(huì)把每個(gè)業(yè)務(wù)邏輯寫到一個(gè)單獨(dú)的腳本里,在服務(wù)器上逐一調(diào)用,每次都要手工去敲命令。
如果我們把這些腳本放到一個(gè)調(diào)用腳本里呢? 執(zhí)行的時(shí)候去調(diào)用這個(gè)調(diào)用腳本,事實(shí)上linux會(huì)根據(jù)腳本中的順序 串行去調(diào)用這些腳本,還不如自己在服務(wù)器上一個(gè)個(gè)的執(zhí)行快呢,最起碼手工逐個(gè)調(diào)用腳本還是并行的。
常見的串行執(zhí)行
我們通過一個(gè)例子來演示下:
使用1.sh和2.sh模擬業(yè)務(wù)邏輯
[root@artisan test]# cat 1.sh #!/bin/bash echo "1.sh 開始執(zhí)行....." echo "模擬業(yè)務(wù)邏輯,sleep 5秒, duang duang duang~~~" sleep 5s echo "1.sh 執(zhí)行結(jié)束....." [root@artisan test]# cat 2.sh #!/bin/bash echo "2.sh 開始執(zhí)行....." echo "模擬業(yè)務(wù)邏輯,sleep 5秒, duang duang duang~~~" sleep 5s echo "2.sh 執(zhí)行結(jié)束....." [root@artisan test]#我們將調(diào)用腳本放到 call_serial.sh
[root@artisan test]# cat call_serial.sh #!/bin/bash #當(dāng)前目錄下執(zhí)行如下腳本 相對(duì)路徑 ./1.sh ./2.sh echo "繼續(xù)執(zhí)行剩下的邏輯..." [root@artisan test]#執(zhí)行call_serial.sh
call_serial.sh 可知為【串行】
使用&和wait改造
- 在每個(gè)進(jìn)程中使用&符號(hào)進(jìn)行讓腳本在后臺(tái)運(yùn)行,無需等待當(dāng)前進(jìn)程結(jié)束。
- 為了確保每個(gè)進(jìn)程都執(zhí)行完成,最后務(wù)必使用wait關(guān)鍵字,用來確保每一個(gè)子進(jìn)程都執(zhí)行完成。
執(zhí)行下看看效果
call_parallel.sh 可知為【并行】
通過上述的改造,可以大大的提高多個(gè)進(jìn)程并發(fā)執(zhí)行的效率。 對(duì)于可以同時(shí)執(zhí)行的業(yè)務(wù)邏輯,可以充分利用主機(jī)資源,減少等待時(shí)間。
示例二
serial.sh
#!/bin/bash beginTime=`date +%s` num=1 for i in `seq 1 3` doecho $i "業(yè)務(wù)邏輯 開始執(zhí)行,當(dāng)前時(shí)間:" `date "+%Y-%m-%d %H:%M:%S"`sleep 2secho $i "業(yè)務(wù)邏輯 執(zhí)行完成,當(dāng)前時(shí)間:" `date "+%Y-%m-%d %H:%M:%S"`echo "-----------------------------------------------------------" done endTime=`date +%s` echo "總共耗時(shí):" $(($endTime-$beginTime)) "秒"從執(zhí)行結(jié)果來看,串行,每個(gè)進(jìn)程都要耗時(shí)2秒,3個(gè)進(jìn)程6秒處理完成
使用&和wait關(guān)鍵字來改造上上述腳本,使其并行執(zhí)行
parallel.sh
#!/bin/bash beginTime=`date +%s` num=1 for i in `seq 1 3` do{ echo $i "業(yè)務(wù)邏輯 開始執(zhí)行,當(dāng)前時(shí)間:" `date "+%Y-%m-%d %H:%M:%S"`sleep 2secho $i "業(yè)務(wù)邏輯 執(zhí)行完成,當(dāng)前時(shí)間:" `date "+%Y-%m-%d %H:%M:%S"`echo "-----------------------------------------------------------"# 結(jié)尾的&確保每個(gè)進(jìn)程后臺(tái)執(zhí)行}& done # wait關(guān)鍵字確保每一個(gè)子進(jìn)程都執(zhí)行完成 wait endTime=`date +%s` echo "總共耗時(shí):" $(($endTime-$beginTime)) "秒"
從執(zhí)行結(jié)果來看,并行,同時(shí)啟動(dòng)3個(gè)進(jìn)程,3個(gè)進(jìn)程2秒處理完成。
總結(jié)
以上是生活随笔為你收集整理的Shell-使用和wait让你的脚本并行执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发编程-06线程安全性之可见性 (sy
- 下一篇: Spring Boot2.x-13前后端