Shell中并沒有真正意義的多線程,要實現多線程可以啟動多個后端進程,最大程度利用cpu性能。
直接看代碼示例吧。
(1) 順序執行的代碼
1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6 echo "sleep 5" 7 sleep 5 8 } 9 done 10 date
輸出:
Sat Nov 19 09:21:51 CST 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 Sat Nov 19 09:22:16 CST 2016
(2) 并行代碼
使用'&'+wait 實現“多進程”實現
1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6 echo "sleep 5" 7 sleep 5 8 } & 9 done 10 wait ##等待所有子后臺進程結束 11 date
輸出:
Sat Nov 19 09:25:07 CST 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 Sat Nov 19 09:25:12 CST 2016
(3) 對于大量處理任務如何實現啟動后臺進程的數量可控?
簡單的方法可以使用2層for/while循環實現,每次wait內層循環的多個后臺程序執行完成。
但是這種方式的問題是,如果內層循環有“慢節點”可能導致整個任務的執行執行時間長。
更高級的實現可以看(4)
(4) 使用命名管道(fifo)實現每次啟動后臺進程數量可控。
1 #!/bin/bash 2 3 function my_cmd(){ 4 t=$RANDOM 5 t=$[t%15] 6 sleep $t 7 echo "sleep $t s" 8 } 9 10 tmp_fifofile="/tmp/$$.fifo" 11 mkfifo $tmp_fifofile # 新建一個fifo類型的文件 12 exec 6<>$tmp_fifofile # 將fd6指向fifo類型 13 rm $tmp_fifofile #刪也可以 14 15 thread_num=5 # 最大可同時執行線程數量 16 job_num=100 # 任務總數 17 18 #根據線程總數量設置令牌個數 19 for ((i=0;i<${thread_num};i++));do 20 echo 21 done >&6 22 23 for ((i=0;i<${job_num};i++));do # 任務數量 24 # 一個read -u6命令執行一次,就從fd6中減去一個回車符,然后向下執行, 25 # fd6中沒有回車符的時候,就停在這了,從而實現了線程數量控制 26 read -u6 27 28 #可以把具體的需要執行的命令封裝成一個函數 29 { 30 my_cmd 31 } & 32 33 echo >&6 # 當進程結束以后,再向fd6中加上一個回車符,即補上了read -u6減去的那個 34 done 35 36 wait 37 exec 6>&- # 關閉fd6 38 echo "over"
參考:http://lawrence-zxc.github.io/2012/06/16/shell-thread/
posted on 2017-08-02 17:01
xzc 閱讀(356)
評論(0) 編輯 收藏 所屬分類:
linux/unix