如何用shell实现基本的线程池
2016-05-15 19:22
561 查看
本文主要介绍了如何利用bash实现一个基本的线程池。
1.预备知识
{}& 在linux中表示整个代码块放入后台执行
wait wait命令表示等待所有后台进程执行完成
FIFO管道文件
2.实现思路
实现进程池有很多种方式,比如创建文件来判断文件个数等。本文采用了利用fifo文件来实现线程池,同时利用了linux中read命令天然的阻塞来快速实现。
3.具体实现
创建process_pool.sh,具体脚本如下:
已经在最后有一个基本的测试用例,只需
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 socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍