shell脚本中多线程和控制并发数量(包含同一脚本两个不同的并发数量)

正常执行

shell脚本中命令正常执行顺序是从上到下

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
        commands1  
done  
commands2

并发执行

多线程使命令并发执行,减少等待时间,使用wait作用等待所有在此shell脚本中启动的后台任务完成

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
{
        commands1
}&  
done
# 等待所有在此shell脚本中启动的后台任务完成
wait
commands2 

控制并发数量

count值特别大的时候,我们应该控制并发进程的个数,否则会影响系统其他进程的运行,甚至造成死机。

#!/bin/bash
#最大并发数
Thread_num=5
#命名管道文件
Tmp_fifo=/tmp/$$.fifo

#创建命名管道文件
mkfifo $Tmp_fifo
#用文件句柄(随便给个6)打开管道文件
exec 6<> $Tmp_fifo
rm -f $Tmp_fifo

##控制并发数
for i in `seq $Thread_num`
do
        #向管道中放入最大并发数个行,供下面read读取
        echo >&6
done

for i in {1..254}
do
        #通过文件句柄读取行,当行取尽时,停止下一步(并发)
        read -u 6
        {
                #业务代码
                echo "$i"
                sleep 1
        #一个并发执行后要想管道中在加入一个空行,供下次使用
        echo >&6
        }&
done
wait
echo "END"

同一脚本控制两个不同的并发数量

#!/bin/bash
#最大并发数
Thread_num1=50
Thread_num2=5
#命名管道文件
Tmp_fifo=/tmp/$$.fifo

#创建命名管道文件
mkfifo $Tmp_fifo
#用文件句柄(随便给个6)打开管道文件
exec 6<> $Tmp_fifo
rm -f $Tmp_fifo
##控制并发数
for i in `seq $Thread_num1`
do
        #向管道中放入最大并发数个行,供下面read读取
        echo >&6
done


mkfifo $Tmp_fifo
#用文件句柄(随便给个7)打开管道文件
exec 7<> $Tmp_fifo
rm -f $Tmp_fifo
for i in `seq $Thread_num2`
do
        echo >&7
done


for i in {1..254}
do
        #通过文件句柄读取行,当行取尽时,停止下一步(并发)
        read -u 6
        {
                #业务代码
                echo "thread1 $i"
                sleep 1
        #一个并发执行后要想管道中在加入一个空行,供下次使用
        echo >&6
        }&
done
wait


for i in {1..254}
do
        #通过文件句柄读取行,当行取尽时,停止下一步(并发)
        read -u 7
        {
                #业务代码
                echo "thread2 $i"
                sleep 1
        #一个并发执行后要想管道中在加入一个空行,供下次使用
        echo >&7
        }&
done
wait

echo "END"
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值