1. 程式人生 > 實用技巧 >linux shell多程序

linux shell多程序

最近看了一些部落格研究怎麼把單程序的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 { # 獲取鎖 while
read -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.檔案描述符用完記得關閉