您的位置:首页 > 运维架构 > Shell

如何用shell实现基本的线程池

2016-05-15 19:22 561 查看
本文主要介绍了如何利用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
即可看到效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 管道 线程池