################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<&- #删除文件描述符