關於shell的多執行緒
1. 多執行緒併發執行任務,而不用一臺臺的序列執行,能更快更高效
2. Shell並沒有多執行緒的概念,所以:
* 一般使用wait、read等命令技巧性地模擬多執行緒實
* 使用命名管道(fifo)來實現多執行緒的控制
3. 用途:需要對多主機批量執行檢查或操作時(例如ssh、ping等操作)
分段解析一個例子來理解一個多執行緒指令碼的書寫
1. 新建fifo型別檔案
tmp_fifofile="/tmp/$$.fifo" mkfifo $tmp_fifofile #新建fifo型別的檔案 exec 5<>$tmp_fifofile #將fd 5指向fifo型別 rm $tmp_fifofile #可刪除 #這裡的$$.fifo/5都是一個檔名而已,可隨意
2. 定義執行緒數,迴圈鍵入字元,通過字元控制實現執行緒數量控制
thread=5 # $thread 定義的是執行緒數,thread=5的意思是每次最多同時執行5個執行緒 #寫一個for迴圈隨便echo個字元在5這個檔案中,實際上我們就是通過對這個字元的數量控制來實現對執行緒數量的控制的 for ((i=0;i<$thread;i++)) do echo done >&5
3. 執行任務
# read -u <fd>命令的意義是:read input from file descriptor fd. 讀取來自檔案描述符fd的輸入 # 實際上我們是通過“read -u 5”來實現每次從5中減去一個字元, job_num=20 # $job_num定義了總的任務數 for ((i=0;i<$job_num;i++)) do read -u5 { sleep 3 && echo "Hello World" || echo "Hello error" ...... ===>這些部分就是我們要執行的命令,可封裝成函式 ...... echo >&5 #多加回一個字元 }& done
4. 等待、關閉、退出
wait #等待所有子程式結束 exec 5>&- #關閉fd 5 exit 0 #成功退出
5. 執行結果
我們的job_num有20個,thread定義了5個 即每5個每5個這樣執行 一共需要執行4次(單執行緒就要執行20次了) 每次執行是3s,所以共花費3*4=12s # time sh dxc.sh Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World real 0m12.064s user 0m0.020s sys 0m0.042s