linux shell多程序
阿新 • • 發佈:2020-08-16
最近看了一些部落格研究怎麼把單程序的shell指令碼改成多程序提升效率,大多數寫的都不盡如人意,決定自己寫一個
首先看單程序指令碼
#!/bin/bash function task { arg=${1} echo "執行任務: ${arg}" # 假設每個任務平均耗時2s sleep 2s } # 一共釋出20個任務 for ((i=0; i<20; i++)) do task ${i} done
單程序順序執行需要耗費40s
再看多程序版本
#!/bin/bash function task { arg=${1} echo "執行任務: ${arg}" # 假設每個任務平均耗時2s sleep 2s } # 建立佇列和鎖 mkfifo list mkfifo lock # 插入多個數據不阻塞 exec 3<>list exec 4<>lock # 主程序釋出任務到佇列 for i in {1..20}; do echo ${i} >&3 done # 釋放鎖 echo >&4 # 開啟4個程序 threads=4 for ((i = 0; i < ${threads}; i++)); do { # 獲取鎖 whileread -t 1 -u 4; do if read -t 1 -u 3 arg; then # 釋放鎖 echo >&4 # 任務程式碼 task ${arg} fi done } & done wait # 關閉佇列和檔案描述符 exec 3>&- exec 4>&- rm -rf list rm -rf lock
多程序指令碼開啟4個子程序同時處理20個任務,一共只需要10s
總結:
1.多程序一個關鍵點就是fifo佇列,從佇列中沒有讀取到資料時程序回阻塞
2.給fifo佇列新增檔案描述符後,插入資料時不會阻塞
3.程序結束的方式選擇了read -t,超時後自動退出,這樣做邏輯比較簡單,如果用主程序訊號通知的方式邏輯比較複雜,沒有選擇那樣實現
4.多程序從同一個fifo佇列資料預設會有執行緒安全問題,為此又用了一個佇列lock通過加鎖解鎖解決
5.檔案描述符用完記得關閉