002-Shell的并发执行原理及其实现

1、正常执行

如果是多个命令执行的话,默认是串行执行的。如果前面的一个任务没有执行完成,后面的任务就无法执行,即不可能将指令置于CPU上执行。

sleep 10

后台执行。Default模式下,shell命令是阻塞执行的,可以通过其后添加&让这条命令异步执行,如:

sleep 10 &

执行这条命令后,并不会阻塞10秒,而是立即返回。

2、并行执行

注意:这里的并行执行如果是单核CPU的话,实际上指的是并发执行。并发执行是具备并行执行的前提因素。

如果将这种方法用在while循环中,则可以实现多进程并行处理。例如一下test1.sh文件为:


#!/bin/bash
while read line
do
{
  command 1
} &
done

command 2

这样的话command 1就可以并行执行了,其实质是将每条command 1命令作为后台进程在执行,这样主进程就不用等待前面的命令执行完毕之后才开始执行接下来的命令。通过执行ls -l | test1.sh可以看到并发的进程数量。

但是这样带来一个问题: 如果在while循环外面的command 2需要用到循环内部执行得到的结果,那么像test1.sh的这种写法就不work了。我们可以对其做简单修改,达到上述目的,如test2.sh:


#!/bin/bash
while read line
do
{
  command 1
} &
done
wait

command 2

上面的代码是将所有的command 1在后台并行执行,等到循环里面的命令都结束之后才执行接下来的command 2。

3、shell脚本的并发控制

有时为了避免并发进程数过多,导致机器卡死,需要限制并发的数量。以下代码实现了该功能:

#!/bin/bash
while read line
do
{
  joblist=($(jobs -p))
  while (( ${#joblist[*]} >= 20 ))
  do
  {
      sleep 1
      joblist=($(jobs -p))
  }
  done
  sleep 10 &
}
done

以上方法通过控制后台任务数来控制并发进程数目在20个以内。



参考:https://blog.csdn.net/p656456564545/article/details/80681934

原文地址:https://blog.51cto.com/mjunetwslinux/2378725

时间: 2024-08-06 19:59:27

002-Shell的并发执行原理及其实现的相关文章

shell模拟并发执行

参考: http://www.51testing.com/html/28/116228-238978.html http://blog.chinaunix.net/uid-27571599-id-3473078.html         在bash中,使用后台任务来实现任务的多进程化.在不加控制的模式下,不管有多少任务,全部都后台执行.也就是说,在这种情况下,有多少任务就有多少"进程"在同时执行.   实例一:正常脚本(脚本功能:查看一个文件中的IP列表循环测试主机连通性) [[ema

Shell脚本中的多任务并发执行

正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令.比如下面这段代码: #!/bin/bash for i in {1..10};do echo $i done echo "END" 执行结果: 1 2 3 4 5 6 7 8 9 10 END 可以看到,循环体中的"echo $i"命令是串行执行的.但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡在那里,长时间失去响应.比如我们需要完成这

linux shell执行原理

shell简介 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. 运行背景 a 一个基本的linux系统结构 b.由上图可以看出,shell 在系统中是处于中间层次的.他为用户和kernel的交互提供了一种方式,方案. c.关于分层结构的众多优势: 1.开发人员可以只关注整个结构中的其中某一层:2.可以很容易的用新的实现来替换原有层次的实现:3.可以降低层与层之间的依赖:4.有利于标准化:5.利于各层逻辑的复用. 缺点: 1.降低了系

【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比如最大在100Mb/s,如果直接启动100个scp,则又会遇到ssh的并发连接数限制. 所以需要控制并发数,即不超过ssh的并发限制,又要让单网卡上的带宽接近饱和,尽快完成传输(假设专线带宽远大于单机网卡带宽) 实现 之前知道通过mkfifo创建一个命名管道,可以实现对并发的控制.现在来实现一个.

linux shell 创建并发后台执行任务并等待任务执行完成

#!/bin/bash echo "i am main" for i in $(seq 1 5) do { sleep 10; echo "i am $i"; }& done wait http://www.cnblogs.com/dorothychai/archive/2012/10/19/2730374.html linux shell 创建并发后台执行任务并等待任务执行完成

erlang虚拟机代码执行原理

erlang是开源的,很多人都研究过源代码.但是,从erlang代码到c代码,这是个不小的跨度,而且代码也比较复杂.所以这里,我利用一些时间,整理下erlang代码的执行过程,从erlang代码编译过程,到代码执行过程做讲解,然后重点讲下虚拟机执行代码的原理.将本篇文章,献给所有喜欢erlang的人. erlang代码编译过程 erlang对开发者是友好的,从erlang程序文件编译成能被erlang虚拟机识别的beam文件,在这个编译过程还对开发者暴露中间代码.借助这个中间代码,我们就可以逐步

MapReduce调度与执行原理系列文章

转自:http://blog.csdn.net/jaytalent?viewmode=contents 一.MapReduce调度与执行原理之作业提交 二.MapReduce调度与执行原理之作业初始化 三.MapReduce调度与执行原理之任务调度 四.MapReduce调度与执行原理之任务调度(续) 前言:本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相

Python程序的执行原理(转载)

Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 2. 字节码 字节码在Python虚拟机程序里对应的是PyCodeObject对象..pyc文件是字节码在磁盘上的表现形式. 3. pyc文件 PyCodeObject对象的创建时机是模块加载的时候,即import.Python test.py会对test.py进行编译成字节码

java 程序执行原理

转自:http://blog.csdn.net/walkingmanc/article/details/6369487java 应用可以打包成jar 格式, jar格式其实只是一种很普通的压缩格式,与zip格式一样,只不过是它会在压缩文件的目录结构中增加一个META-INF/ MANIFEST.MF 的元文件. 我们知道,经过编译的字节码class文件可以直接放到java虚拟机去解释执行(JIT方式), 我们通过在命令行调用“java class文件的路径”就可以使用jvm(java.exe/j