#!/bin/bash
#by inmoonlight@163.com

#下面的代码控制并发数。其实是利用令牌原理实现
#一个线程要运行,首先要拿到令牌在该代码中即read一行数据,读取不到就会暂停,否则就拿到数据就运行命令,当完成后将令牌放回
#将令牌放回即再在管道文件中写入一行数据,这里的数据是换行符,echo >&4。这样另外的线程就可以再读该数据(拿到令牌)并运行

#!/bin/bash
tmpf=$0.fifo       #命名管道
mkfifo $tmpf       #创建管道
exec 4<>$tmpf      #创建文件描述符4,以读写方式操作管道
rm $tmpf        #删除创建的管道

thred=4         #指定并发数
seq=(1 2 3 4 5 6 7 8 9 21 22 23 24 25 31 32 33 34 35)     #创建线程的任务列表

#为并发线程创建相应个数的占位
{
  for (( i = 1;i<=${thred};i++ ))
  do
    echo;             #因read命令读取一行,而echo默认输出换行符,所以为每个线程输出占位换行
  done
} >&4                  #将占位写入管道(输出给文件描述符4 --> &4 的作用,如果不加 "&" 会被bash解释为文件名)

for id in ${seq[*]}            #从任务列表"seq"按顺序获取任务,或:for id in ${seq}
do
  read                      #读取一行,即fd4中的一个占位符
  (./command ${id}; echo >&4 ) &      #在后台执行任务command并将任务${id}赋予当前任务command;执行完成后在fd4中写入一个换行占位 ,"&" 即将其之前部分放入后台实现并行执行
done <&4         #指定fd4为整个for的stdin(读取fd4的占位信息)

wait            #阻塞等待所有在此脚本中的后台任务:"{.....}&" 完成
exec 4>&-        #关闭管道

#以上流程中read、echo对fd4的交替写和读是并发处理的关键!,可以想象若read读取不到fd4中数据时将等待fd4

转载于:https://www.cnblogs.com/bluevitality/p/6524147.html

Shell脚本实现模拟并发及并发数控制相关推荐

  1. Android自动化测试之Shell脚本一——模拟触屏事件

    摘自:http://guolin.guosfamily.com/2012/02/15/android-automated-test-by-shell-touch-event/ Android自动化测试 ...

  2. Linux Shell 脚本限制ssh最大用户登录数

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1670233 我撰 ...

  3. linux远程连接最大数是多少,Linux Shell 脚本限制ssh最大用户登录数

    我撰写本文原来的意图是想把"复制SSH渠道"和"copy SSH Session"这样的功能从远程ssh客户端中剔除掉.因此想到可以在SSH服务端设置一下,但查 ...

  4. linux ssh最大会话数,Linux Shell 脚本限制ssh最大用户登录数

    我撰写本文原来的意图是想把"复制SSH渠道"和"copy SSH Session"这样的功能从远程ssh客户端中剔除掉.因此想到可以在SSH服务端设置一下,但查 ...

  5. SHELL/SSH基础知识(入门篇)-包含 shell 脚本语言的基本用法、 shell 脚本语言的基本用法、流程控制、函数 function、其它脚本相关工具、数组 array(欢迎留言交流)

    目录 1 shell 脚本语言的基本用法 1.1 shell 脚本注释规范 1.1.1 shell 脚本注释规范 1.1.2 执行(5种) 1.1.3 在远程主机运行本地脚本 1.1.4 检查shel ...

  6. shell脚本编程学习笔记8(XDL)——流程控制和循环

    shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...

  7. Shell脚本Ping监控主机是否存活并发邮件报警(三种方法)

    #前提已经可以通过mail或mutt客户端发邮件 1.先安装sendmail来发邮件 # yum -y install sendmail# /etc/init.d/sendmail start# ch ...

  8. Shell脚本中的并发

    主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有 ...

  9. Shell脚本中的并发(转)

    转自http://blog.csdn.net/wangtaoking1/article/details/9838571 主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚 ...

最新文章

  1. mysql myisam innodb 区别
  2. 服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...
  3. 三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题
  4. 1-36随机生成6个不重复的数
  5. OpenCV处理引起光学错觉的图像
  6. 吕述望 计算机网络专家,特稿: 中科院吕述望教授:互联网名不符实
  7. UVa 140 Bandwidth【枚举排列】
  8. 2019.7.17东湖大数据页面三
  9. WPFのDecorator 、Adorner和AdornerDecorator
  10. linux命令及其使用方法,Linux命令及其使用方法
  11. iSPRINT:Google 最高能的创新加速课程,清华老师都来给点赞!
  12. Kattis - whatdoesthefoxsay —— 字符串
  13. linux抓包命令不用root用户,linux中非root用户使用wireshark进行抓包
  14. 数据新闻周报:阿尔法狗将挑战德州扑克
  15. java求阶乘不内存溢出_java - Java阶乘GUI - 堆栈内存溢出
  16. USSD设置呼叫转移功能
  17. Win10系统如何在Word中添加新字体
  18. 发出商品杀手锏之SAP在途库存解决方案
  19. 前端高效开发必备的js库梳理,日常使用中会持续更新
  20. pandas:世界各国GDP数据集数据清洗案例

热门文章

  1. 摘自缪雪峰的博客的JavaScript个人笔记(3)
  2. Linux查看硬件信息命令大全
  3. 一文精通 crontab从入门到出坑
  4. 帆软报表插件开发之fine-decision中的ControllerRegisterProvider扩展
  5. btoa java,JavaScript用btoa和atob来编码解码Base64
  6. limit mysql 取最后_更优美的 limit 使用方法 (limit 对 mysql 数据查询的性能影响)
  7. linux安装nvidia黑屏,GTX 550 Ti 安装Linux遇到的问题 黑屏 显示器休眠
  8. 大工20春《计算机应用基础》在线测试,大工20春《计算机应用基础》在线测试1答案...
  9. 软件工程导论 08章软件维护
  10. ubuntu下caffe 安装记录(含GPU)