本文主要介紹瞭如何利用bash實現一個基本的線程池。
1.預備知識
{}& 在linux中表示整個代碼塊放入後臺執行
wait wait命令表示等待所有後臺進程執行完成
FIFO管道文件
2.實現思路
實現進程池有很多種方式,比如創建文件來判斷文件個數等。本文采用了利用fifo文件來實現線程池,同時利用了linux中read命令天然的阻塞來快速實現。
3.具體實現
創建process_pool.sh,具體腳本如下:
#!/bin/bash #線程池 process_pool(){ #判斷輸入參數等 if [ $# -lt 3 ]; then echo "$0 process_num command [args]" return 1 fi _process_num=$1 shift _func=$1 shift if [[ ! $_process_num =~ ^[0-9]+$ ]]; then echo "process_num must be a number" return 1 fi if !type $_func >/dev/null 2>&1; then echo "comannd must be executable" return 1 fi # 創建一個先進先出的管道文件 fifo="/tmp/$$.fifo" mkfifo $fifo #創建一個文件描述符號,把FD這個文件描述符關聯到這個文件 #{FD}表示非顯示的描述符 exec {FD}<>$fifo rm $fifo # 創建槽位 for i in $(seq $_process_num); do echo >&$FD done # 執行具體命令 for arg in $@; do read -u $FD { $_func $arg echo >&$FD }& done # wait等待所有後臺進程執行完成 wait # 釋放文件描述符 exec {FD}>&- } #以下爲測試 test(){ echo $1 sleep 3 return 0 } process_pool 3 'test' 1 2 3 4 5 6 7
已經在最後有一個基本的測試用例,只需
sh process_pool.sh
即可看到效果。