本文主要介绍了如何利用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 [email protected]; 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
即可看到效果。
时间: 2024-10-14 05:30:22