linux循环创建线程池,如何用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

即可看到效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值