隨筆-314  評(píng)論-209  文章-0  trackbacks-0

          Shell中并沒(méi)有真正意義的多線程,要實(shí)現(xiàn)多線程可以啟動(dòng)多個(gè)后端進(jìn)程,最大程度利用cpu性能。

          直接看代碼示例吧。

          (1) 順序執(zhí)行的代碼

          復(fù)制代碼
           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 
          復(fù)制代碼

          輸出:

          復(fù)制代碼
          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
          復(fù)制代碼

          (2) 并行代碼

          使用'&'+wait 實(shí)現(xiàn)“多進(jìn)程”實(shí)現(xiàn)

          復(fù)制代碼
           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  ##等待所有子后臺(tái)進(jìn)程結(jié)束 11 date
          復(fù)制代碼

          輸出:

          復(fù)制代碼
          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
          復(fù)制代碼

           (3) 對(duì)于大量處理任務(wù)如何實(shí)現(xiàn)啟動(dòng)后臺(tái)進(jìn)程的數(shù)量可控?

            簡(jiǎn)單的方法可以使用2層for/while循環(huán)實(shí)現(xiàn),每次wait內(nèi)層循環(huán)的多個(gè)后臺(tái)程序執(zhí)行完成

            但是這種方式的問(wèn)題是,如果內(nèi)層循環(huán)有“慢節(jié)點(diǎn)”可能導(dǎo)致整個(gè)任務(wù)的執(zhí)行執(zhí)行時(shí)間長(zhǎng)。

            更高級(jí)的實(shí)現(xiàn)可以看(4)

          (4) 使用命名管道(fifo)實(shí)現(xiàn)每次啟動(dòng)后臺(tái)進(jìn)程數(shù)量可控。 

          復(fù)制代碼
           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      # 新建一個(gè)fifo類型的文件 12 exec 6<>$tmp_fifofile     # 將fd6指向fifo類型 13 rm $tmp_fifofile    #刪也可以 14  15 thread_num=5  # 最大可同時(shí)執(zhí)行線程數(shù)量 16 job_num=100   # 任務(wù)總數(shù) 17  18 #根據(jù)線程總數(shù)量設(shè)置令牌個(gè)數(shù) 19 for ((i=0;i<${thread_num};i++));do 20     echo 21 done >&6  22  23 for ((i=0;i<${job_num};i++));do # 任務(wù)數(shù)量 24     # 一個(gè)read -u6命令執(zhí)行一次,就從fd6中減去一個(gè)回車符,然后向下執(zhí)行, 25     # fd6中沒(méi)有回車符的時(shí)候,就停在這了,從而實(shí)現(xiàn)了線程數(shù)量控制 26     read -u6  27  28     #可以把具體的需要執(zhí)行的命令封裝成一個(gè)函數(shù) 29     {    30         my_cmd 31     } & 32  33     echo >&6 # 當(dāng)進(jìn)程結(jié)束以后,再向fd6中加上一個(gè)回車符,即補(bǔ)上了read -u6減去的那個(gè) 34 done 35  36 wait 37 exec 6>&- # 關(guān)閉fd6 38 echo "over"
          復(fù)制代碼

           

          參考:http://lawrence-zxc.github.io/2012/06/16/shell-thread/

          posted on 2017-08-02 17:01 xzc 閱讀(368) 評(píng)論(0)  編輯  收藏 所屬分類: linux/unix
          主站蜘蛛池模板: 财经| 堆龙德庆县| 嵩明县| 化隆| 称多县| 威海市| 宜宾市| 元氏县| 社旗县| 灵宝市| 丰城市| 衡阳县| 兴山县| 安顺市| 临武县| 桐乡市| 金溪县| 河曲县| 淳化县| 黎川县| 开化县| 藁城市| 西充县| 尤溪县| 明星| 普定县| 汾西县| 桂平市| 石柱| 文登市| 兴仁县| 嵊泗县| 岐山县| 手游| 南靖县| 晴隆县| 贵州省| 天镇县| 新乡市| 长沙市| 修文县|