如何用shell實現基本的線程池

本文主要介紹瞭如何利用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

即可看到效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章