linux下实现并发逻辑

################shell 模拟实现并发跑数#################
有时候我们知道一些程序是可以同时跑的,互不影响,为了提高效率不得不使用并发跑脚本

#1、思路一
我们都知道在linux中把程序丢后台跑脚本,我们可以同时跑很多个,这就是实现并发的思路,但是呢?
如果我们一次性跑很多的后台程序,如果服务器没能扛住。。。。这就尴尬了,如果手工控制。。这就有点low了

#2、思路二
基于上面我们弄个改进版,我们写个循环,分批跑,每批保证每次只能跑10个,这样就解决上面的问题啦
但是,分批跑,每一批都要等上一批跑完了,下一批才能继续,如果每个批次中都有那么一个跑的很慢,这样就效率低啦

#3、思路三
就像现在的服务一样,比如银行,我们都知道去银行办理手续都是先那个号,假设银行有10个窗口,我们都知道有些人办理的
业务很简单,分分钟就完事了,但是有些人就很慢了,所以每个人手上都要有个编号,按照编号进行处理,这样就可以保证每个
窗口都一值保持给客户办理业务啦。这就是处理linux并发的逻辑了


实现:
就是采用有名管道mkfifo命令和exec命令实现,管道有阻塞的特点,要等待传送值才继续运行,如有不懂的小伙伴,可以去度娘

#!/bin/bash
############################################
## Author:lugh1
## Blog:
## Time:2019-06-04 16:46:07
## Version:V 1.0
## Description:并发跑数到gp对应的exp表
############################################

#检查参数。。。。

PWD=`cd $(dirname "$0");pwd` #获取脚本的目录

#创建临时管道文件 
mkfifo $PWD/fifo_file

#以读写方式打开fifo_file管道文件,文件描述符为4(赋予其有管道的特性),也可以取3-9任意描述符 
exec 3<>$PWD/fifo_file

#删除临时管道文件,也可不删除
rm -f $PWD/fifo_file

#设置并发数,也就是举例中银行的窗口数
for ((i=0;i<10;i++)) 
do
  echo "" > &3
done

#循环所有要执行任务,这里根据自己的业务需求修改循环
while true
do
  read -u3 #从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行,
        #也就是有一个人去一个窗口办理业务了,所以就少了一个可用的窗口

   {
    sh shell.sh #这里放置自己要跑的逻辑
    echo "" >&3 
   }& #放入后台执行,这里表示一个人在一个窗口开始办理业务,占据了一个位置,所以这个人占据位置和办理业务是
     #绑定在一起的,所以需要{}&,表示当这个人办理完了,就离开了,然后就释放了那个座位,下一个持有编号对的人
        #又可以在该窗口办理业务了
done
wait #等待所有后台进程执行完成
exec 3>&- #删除文件描述符
exec 3<&- #删除文件描述符

 

posted @ 2019-07-05 17:42  一寸HUI  阅读(1554)  评论(0编辑  收藏  举报