#!/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

最新文章

  1. (转)解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
  2. css-css权威指南学习笔记7
  3. A*寻路算法
  4. Json序列化与反序列化
  5. .NET(C#):await返回Task的async方法
  6. 【分布式协调器】Paxos的工程实现-Cocklebur状态转移
  7. JNI NDK开发Crash错误定位 调试
  8. SQL PROMPT 取消dbo前缀
  9. shell脚本初析
  10. C++时间戳转化(涉及GMT CST时区转化)
  11. apache问题集锦
  12. MVC4网站发布到windows server 2003服务器
  13. C#中object sender,EventHandler e有个毛作用
  14. Storm 集群安装配置
  15. django进阶-3
  16. [转载] Bitmap的秘密
  17. jquery字符串操作
  18. springboot、springsecurity、jwt权限验证
  19. HttpServlet
  20. Visual Studio 2017 集成Crystal Report为ASP.NET MVC呈现报表

热门文章

  1. Python 面试题整理
  2. 一种简单方便的postgresql插件multicorn安装方法 ---yum install multicorn10.x86_64
  3. HDLbits——Mt2015 lfsr
  4. centos7 yum安装配置Lnmp和负载配置
  5. P1067 [NOIP2009 普及组] 多项式输出 题解
  6. kibana7.6.2源码开发编译
  7. MySQL 常用命令(4)------mysqladmin命令详解
  8. 异步按照同步顺序执行的function
  9. css实现图片在div中居中的效果
  10. 【逆向】Magniber 勒索软件样本分析