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 @   一寸HUI  阅读(1558)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示