隨筆-314  評論-209  文章-0  trackbacks-0

          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 閱讀(366) 評論(0)  編輯  收藏 所屬分類: linux/unix
          主站蜘蛛池模板: 永善县| 普陀区| 南华县| 天镇县| 大庆市| 新绛县| 林芝县| 望都县| 容城县| 浠水县| 潮安县| 丽江市| 龙陵县| 昆明市| 武宣县| 崇州市| 红原县| 南丹县| 乐陵市| 敦化市| 嘉兴市| 大连市| 磴口县| 永仁县| 铅山县| 巴楚县| 天门市| 冀州市| 阳东县| 沙雅县| 吉首市| 阜城县| 平和县| 小金县| 景东| 崇义县| 龙州县| 宜君县| 岢岚县| 通辽市| 衡阳县|