在批量执行任务时,单进程执行速度太慢,使用&不加数量控制,又担心资源占用过多,导致宕机等问题,因此我们需要控制并发进程的数量,保证效率的同时,保证资源占用不会太高。

其中一个解决思路是利用简单的生产者-消费者模型。

以下为范例脚本:

span { font-family: "Courier New"; font-size: 10pt; color: rgba(0, 0, 0, 1) }
.sc0 { }
.sc2 { color: rgba(0, 128, 0, 1) }
.sc3 { color: rgba(255, 0, 0, 1) }
.sc4 { font-weight: bold; color: rgba(0, 0, 255, 1) }
.sc5 { color: rgba(128, 128, 128, 1) }
.sc7 { font-weight: bold; color: rgba(128, 64, 0, 1) }
.sc8 { }
.sc9 { font-weight: bold; color: rgba(255, 128, 64, 1); background: rgba(255, 255, 217, 1) }
.sc11 { font-weight: bold; color: rgba(128, 64, 64, 1); background: rgba(225, 255, 243, 1) }

#!/bin/bash
fifo_file=a.pipe
mkfifo $fifo_file #创建任务队列
exec 5<>$fifo_file
rm $fifo_file
process_num=10 #并发任务的数量
 
function task() #要执行的任务
{
  sleep 2
}
 
#初始化任务队列,向队列里添加process_num个任务额度
for ((i=0;i<process_num;i++))
do
  echo "" ;
done >&5
 
while read line #不断从任务列表中获取任务
do
  read -u 5 #从任务队列中获取一个任务,即消费一个额度
  {
    echo $(echo $line | awk '{print $1}')
    task #执行任务
    echo "" >&5 #任务执行完成之后,再产生一个任务额度到任务队列
  }&
done < task_list
 
wait #等待所有子进程执行完毕
exec 5>&- #关闭任务队列
exit 0
 
 
注:task_list中内容如下
1 test line
2 test line
3 test line
...
99 test line

span { font-family: "Courier New"; font-size: 10pt; color: rgba(0, 0, 0, 1) }
.sc0 { }
.sc2 { color: rgba(0, 128, 0, 1) }
.sc3 { color: rgba(255, 0, 0, 1) }
.sc4 { font-weight: bold; color: rgba(0, 0, 255, 1) }
.sc5 { color: rgba(128, 128, 128, 1) }
.sc7 { font-weight: bold; color: rgba(128, 64, 0, 1) }
.sc8 { }
.sc9 { font-weight: bold; color: rgba(255, 128, 64, 1); background: rgba(255, 255, 217, 1) }
.sc11 { font-weight: bold; color: rgba(128, 64, 64, 1); background: rgba(225, 255, 243, 1) }
span { font-family: "Courier New"; font-size: 10pt; color: rgba(0, 0, 0, 1) }
.sc0 { }
.sc2 { color: rgba(0, 128, 0, 1) }
.sc3 { color: rgba(255, 0, 0, 1) }
.sc4 { font-weight: bold; color: rgba(0, 0, 255, 1) }
.sc5 { color: rgba(128, 128, 128, 1) }
.sc7 { font-weight: bold; color: rgba(128, 64, 0, 1) }
.sc8 { }
.sc9 { font-weight: bold; color: rgba(255, 128, 64, 1); background: rgba(255, 255, 217, 1) }
.sc11 { font-weight: bold; color: rgba(128, 64, 64, 1); background: rgba(225, 255, 243, 1) }

shell多进程并发数控制的更多相关文章

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

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

  2. 分享项目中在用的asp.net下载业务的服务端基类(支持客户端显示下载百分比进度,支持并发数控制,支持限速)

    /// <summary> /// 功能简介:asp.net的下载业务的服务端基类(支持客户端显示下载百分比进度,支持并发数控制,支持限速) /// 创建时间:2015-11-20 /// ...

  3. Java并发工具类之并发数控制神器Semaphore

    Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所( ...

  4. GO瞬间并发数控制

    var wg2 sync.WaitGroup wg2.Add(nums) xc :=0 parallelNum := plt.MaxParallel var waitCount int32 = 0 f ...

  5. Shell-使用mkfifo实现多任务并发及并发数控制

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

  6. Lavavel5.5源代码 - 并发数控制

    app('redis')->connection('default')->funnel('key000') // 每个资源最大锁定10秒自动过期,只有60个资源(并发),在3秒内获取不到锁 ...

  7. Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数

    可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol ...

  8. 利用apache限制IP并发数和下载流量控制

    一,为什么要对IP并发数,下载流量进行控制 说正题之前,先给大家讲个故事,那是在2007年,我进了一家公司,当时我们正在给达芙妮做电子商务网,www.idaphne.com.从三月份开始做的吧,九月份 ...

  9. curl命令,curl实现post,curl监控网页shell脚本,curl多进程实现并控制进程数,

    cURL > Docs > Tutorial:  http://curl.haxx.se/docs/httpscripting.html 下载单个文件,默认将输出打印到标准输出中(STDO ...

  10. dubbo是如何控制并发数和限流的?

    ExecuteLimitFilter ExecuteLimitFilter ,在服务提供者,通过 的 "executes" 统一配置项开启: 表示每服务的每方法最大可并行执行请求数 ...

随机推荐

  1. M1 执行pod install 报错

    解决方案 安装ffi后sudo arch -x86_64 gem install ffi//第一次 需要 如下 后面 直接 pod install 就可以了arch -x86_64 pod insta ...

  2. 通过python程序让MySQL利用binlog恢复误操作数据

    MySQL利用binlog恢复误操作数据 在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线 ...

  3. linux三权分立账号创建

    系统管理员 创建系统管理员(sys用户)并设置密码 [root@localhost ~]# useradd sys [root@localhost ~]# passwd sys 创建组并将用户添加到组 ...

  4. 手动实现IOC

    spring官方实现的ioc是通过反射和xml技术实现的,下面我们可以根据这个思路简单实现一下IOC,此处省略构建项目,项目的整体结构如图 第一步,在resources目录下创建beans.xml文件 ...

  5. Oracle数据库简单常用语句

    简单常用语句: 登录超级用户 sqlplus / as sysdba; 登录普通用户 connect username/password; 显示当前用户名 show user; 查询所有用户名 sel ...

  6. linux下使用bt-rm 限速删除文件

    下载限速删除工具: 链接:https://pan.baidu.com/s/1xXu4Hzr99wLlipqxVkXkBg 密码:upbe nohup ./bt-rm -l 10 ${文件地址} &am ...

  7. stm32 微秒定延时问题

    problem: 如果想用计时器定时微秒级,不要使能自动重载:代码如下: static uint16_t counter; void Delay_us(uint32_t us){ counter=0x ...

  8. 基础vue的一些知识补充

    一.:disabled 该属性能接受布尔值,可以用于元素的使用.当值为true时,该元素将无法被使用,如button的disabled属性被设置为true后,将无法被点击,input的disabled ...

  9. 手机 termux 开启ssh 并连接

    第一步 :下载  termux https://f-droid.org/packages/com.termux/ 第二步 :安装  termux 打开后安装  pkg install openssh ...

  10. centeros忘记root登录密码

    转载自:https://www.cnblogs.com/dongml/p/10333819.html 很多时候我们都会忘记Linux root 用户的口令,下面就教大家如果忘记root口令怎么办 第1 ...