以下为代码实现的一个模拟场景:
3个生产者,在不断提供服务,处理需求,假设1s处理一个。
20个消费者,在不断消耗供给产品,提交需求,假设3s消耗一个。

情景分析:由于消费者的提交需求能力 和 生产者处理需求的能力 不对等,于是出现了供不应求的供销矛盾。

问题:一般情况下,在供不应求时,会有大量的需求被挂起,也就是排队,排队期间消费者不得离开,否则当前所处的队列顺序就被后面的消费者替代。这样所有排队的消费者都无法干别的事,只能空等,类比操作系统中内存、计算单元等资源被空占,影响整体效率。

解决思路:通过队列来提前收取需求,类似于自动帮消费者记录排队顺序,这样等轮到自己时,再去执行。那么节省出来的等待时间,就可以去做别的事情,类比操作系统中资源释放。

#!/bin/bash
IPLIST=/home/meta/ipinfo/iplist #任务(消费者)
THREAD=50                              #声明并发线程并发个数,这个是此应用的关键,也就是设置管道的最大任务数
TMPFIFO=/tmp/$$.fifo               #声明管道名称,'$$'表示脚本当前运行的进程PID
mkfifo $TMPFIFO                      #创建管道
exec 5<>${TMPFIFO}               #创建文件标示符“5”,这个数字可以为除“0”、“1”、“2”之外的所有未声明过的字符, 以读写模式操作管道文件;系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变, 换句话说就是在调用进程内部执行一个可执行文件
rm -rf ${TMPFIFO}               #清除创建的管道文件

#为并发线程创建同样个数的占位
for((i=1;i<=$THREAD;i++))
do
   echo ;     /*借用read命令一次读取一行的特性,使用一个echo默认输出一个换行符,来确保每一行只有一个线程占位;
                这里让人联想到生产者&消费者模型,管道文件充当消息队列,来记录消费者的需求,然后由生产者去领任务,并完成任务,
                这里运用了异步解耦的思想*/
done >&5                
 #将占位信息写入管道

for i in $(cat ${IPLIST} |grep -viE "^#|备机|ts"|awk '{print $1}')       #从任务队列中依次读取任务
do
   read -u5        /*从文件描述符管道中,获取一个管道的线程占位然后开始执行操作;read中 -u 后面跟fd,表示从文件描述符中读入,
                           该文件描述符可以是exec新开启的*/
    {
        echo $(cat ~/ipinfo/iplist|grep $i|awk '{print $2}');
        ssh -oConnectTimeout=10 -oConnectionAttempts=3 $i "cd /home/Log/;grep 'MIL' mission_2016-08-03*.log |awk -F, '{if(\$19==1370) print \$0}'|
        awk -F, '{if(\$20==0) print \$0}'>miss_info.txt"
        echo "" >&5    /*任务执行完后在fd5中写入一个占位符,以保证这个线程执行完后,线程继续保持占位,继而维持管道中永远是50个线程数,
                         &表示该部分命令/任务放入后台不占当前的bash,实现并行处理*/
    } &
done
wait                #等待父进程的子进程都执行结束后再结束父进程          
exec 5>&-           #关闭fd5的管道
exit 0

例子:

#!/bin/sh

thread=
tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile
exec <>$tmp_fifofile
rm $tmp_fifofile i=
while(($i<=$thread))
do
echo
let i=i+
done >& while read list_pro
do
tabnm=`echo ${list_pro}`
read -u6
spooltime=`date +%c`
{
echo ${tabnm} &&{
sleep
}
echo >&
}&
done < list_pro.txt wait
exec >&-
list_pro.txt
[python@master tmp]$ more list_pro.txt 

可以自己运行试试。。。

while read tablename
do
ftfilename=`echo ${tablename} | awk -F':' '{print $2}'`
fromsc=`echo ${tablename} | awk -F':' '{print $3}'`
fromtb=`echo ${tablename} | awk -F':' '{print $4}'`
tosc=`echo ${tablename} | awk -F':' '{print $5}'`
totb=`echo ${tablename} | awk -F':' '{print $6}'`
read -u6
spooltime=`date +%c`
#subjob start
{
sh ${shell_path}/otoelk.sh ${ftfilename} ${dataDate} ${oracle} ${schema_id} ${fromsc} ${fromtb} ${tosc} ${totb} ${confile} ${shell_path} &&{
sleep
} || {
echo "${oracle} to elk sub error" --出错的时候打印日志
}
echo >&
}&
done < ${confile}

Shell-使用mkfifo实现多任务并发及并发数控制的更多相关文章

  1. Linux Shell多进程并发以及并发数控制

    1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...

  2. Shell 实现多线程(多任务)

    实现方案: 1.命令结尾添加:& #/bin/bash all_num= a=$(date +%H%M%S) ${all_num}` do { echo ${num} } & done ...

  3. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

  4. 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

    原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...

  5. 转载:IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数

    一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...

  6. IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数

    一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...

  7. IIS:连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解

    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...

  8. Java并发多线程 - 并发工具类JUC

    安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...

  9. IIS最大并发连接数 = 队列长度 + IIS最大并发工作线程数

    深入理解IIS的多线程工作机制   首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度.先说这2个数字在哪里看. 最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并 ...

随机推荐

  1. linux文件结构---转发

    linux各文件夹的作用---转载   linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配 ...

  2. php7与其他版本共存

    转自: https://zhangge.net/5088.html php7编译安装 https://zhangge.net/5075.html

  3. vue是一个渐进式的框架,我是这么理解的

    vue是一个渐进式的框架,我是这么理解的 原文地址 时间:2017-10-26 10:37来源:未知 作者:admin 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主 ...

  4. vue新增属性是否会响应式更新?

    原文地址 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官 ...

  5. vue添加滚动事件,解决简书Carol_笑一笑方案中vue移除滚动事件失效的问题

    在写项目的时候,遇到了需要添加滚动事件的问题,在简书Carol_笑一笑这里找到了解决方案.代码如下 <script> export default { name:"vue-scr ...

  6. PJzhang:python基础进阶的10个疗程-two

    猫宁!!! 第2节:python基本图形绘制 保留字是python基础语法的支撑 默写python代码是件挺恐怖的事情!!! 2008年android操作系统诞生 计算时代 编程语言也是一个江湖 C语 ...

  7. VMware 虚拟机安装Mac OS X 10.10

    有图有真相,哈哈 一.下载以上文件 1. vm百度软件下载即可,版本都能满足需要,随意好了 2. unlocker 207 3. Mac OS X 10.10镜像 二.基本步骤 1. 虚拟机的安装 下 ...

  8. 如何限制nginx的响应速率

    参考官方地址:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables 用$limit_rate内置的变量可以限制nginx的 ...

  9. code review规则

    简单可行的code review规则 前言 曾经有一段垃圾代码放在我的面前,我没有拒绝,等我真正开始接手的时候我才后悔莫及,程序员最痛苦的事莫过于此! 每当接手别人的代码,都有一种想重新写一遍的感觉, ...

  10. 强大的strace命令用法详解

    文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和 ...