linux shell 多線程執行程序


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/

 


免責聲明!

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



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