• 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<&- #删除文件描述符
  • 相关阅读:
    Linux切换到su超级用户
    使用Qt ARM交叉编译提示“此qt版本具有一个未知的工具链”
    使用qwt提示error LNK2001 问题的解决方法
    JavaScript中的 in
    JavaScript中的this
    autocad2010指令全集
    Proj.NETProj.NET简介和示例(转载)
    高性能地图优化策略(转载)
    Emgu.CV,OpenCV for C#
    C# 转载网络爬虫
  • 原文地址:https://www.cnblogs.com/zsql/p/11139760.html
Copyright © 2020-2023  润新知