Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux Shell 多執行緒程式設計:以 FIFO + read 控制並發數的實戰範本

編輯:關於 Linux

Bash 原生不支援多執行緒,但可利用「具名管道 (FIFO) + read -u 信號量」模擬固定並發數的工作池。本文提供生產級範本,適用於 SSH 批次巡檢、Ping 掃描、API 並發請求等 I/O 密集型任務。

核心原理

  1. 建立 FIFO:mkfifo /tmp/$$.fifo。
  2. 開啟檔案描述符 (FD) 6 讀寫 FIFO:exec 6<>/tmp/$$.fifo。
  3. 向 FD 6 寫入 N 個換行符 (Token),代表可用並發槽位。
  4. 每個子任務啟動前 read -u6 取走一個 Token (槽位滿則阻塞)。
  5. 子任務結束後 echo >&6 歸還 Token。
  6. wait 等待所有背景子任務完成。

通用範本 parallel.sh

#!/bin/bash
# 使用方式: parallel.sh 並發數 任務清單檔
# 任務清單: 每行一個參數 (如 IP、URL、主機名)

set -euo pipefail

MAX_JOBS=${1:-10}
TASK_FILE=${2:-/dev/stdin}

TMP_FIFO="/tmp/$$.fifo"
mkfifo "$TMP_FIFO"
exec 6<>"$TMP_FIFO"
rm -f "$TMP_FIFO"

# 初始化 Token 池
for ((i=0; i&6
done

task_func() {
    local arg=$1
    # ===== 在此處實作實際任務 =====
    # 範例: ssh 檢查
    ssh -o ConnectTimeout=5 -o BatchMode=yes "$arg" "hostname && uptime"
    # ================================
}

# 讀取任務清單並發派
while IFS= read -r arg; do
    [[ -z "$arg" ]] && continue
    read -u6          # 取 Token (阻塞直到有空槽)
    {
        task_func "$arg"
        echo >&6      # 歸還 Token
    } &
done < "$TASK_FILE"

wait                  # 等待所有背景任務
exec 6>&-             # 關閉 FD 6
echo "所有任務完成"

使用範例

# 1. 建立目標清單
cat > hosts.txt <

進階增強

  • 超時控制:子任務用 timeout 30 task_func "$arg" 防止卡死。
  • 結果收集:子任務輸出導向暫存檔,主進程彙總。
  • 錯誤重試:task_func 內部實作重試邏輯或回傳碼判斷。
  • 進度顯示:主迴圈加計數器,定期 echo -ne "Progress: $done/$total\r"。

替代方案對比

工具優點缺點適用場景
GNU Parallel功能豐富、自動分發、進度條、保序需額外安裝、語法複雜通用並發、跨機器
xargs -P內建、簡單無法控制啟動頻率、難處理複雜邏輯簡單命令並發
FIFO + read (本文)純 Bash、無依賴、精確控制並發、易嵌入腳本需理解 FD/FIFO、錯誤處理需自行實作嵌入式/最小環境、自訂邏輯
Python multiprocessing / asyncio真多執行緒/協程、豐富生態需 Python 環境、啟動較重複雜運算/高併發

注意事項

  • exec 6<>fifo 必須雙向開啟,單向 6< 或 6> 會導致寫入/讀取阻塞。
  • 子任務中若有 read 或 ssh 等消耗 stdin,需加 </dev/null 或重導向,避免搶佔主迴圈 stdin。
  • 大量任務 (萬級) 建議改用 GNU Parallel 或 Python,Bash 進程管理開銷較大。

掌握 FIFO 信號量模式,即可在純 Shell 腳本中實現穩定可控的並發處理,無需額外依賴。

Copyright © Windows教程網 All Rights Reserved