码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-15 19:52:52      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:线程池   linux   fifo   管道   

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

即可看到效果。

本文出自 “Xlows” 博客,请务必保留此出处http://xlows.blog.51cto.com/5380484/1773678

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

标签:线程池   linux   fifo   管道   

原文地址:http://xlows.blog.51cto.com/5380484/1773678

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!