ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Shell脚本实现模拟并发及并发数控制

2021-08-12 13:32:00  阅读:174  来源: 互联网

标签:令牌 Shell read 并发 管道 线程 fd4 模拟


#!/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,read,并发,管道,线程,fd4,模拟
来源: https://www.cnblogs.com/3Dgenome/p/15132250.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有