在脚本里用&后台打开多个子进程,用wait命令可以使这些子进程并行执行。

例1:

fun1(){
while true
do
echo 1
sleep 1
done
} fun2(){
while true
do
echo 2
sleep 1
done
} fun1 &
fun2 &
wait

例2:

#!/bin/bash
for ((i=0;i<5;i++))
do
sleep 3;echo a
done #运行需要15秒。 #!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait #打开5个子进程并行,运行只需要3秒。

例3:

用管道fifo文件来处理并发,本例转自https://my.oschina.net/sanpeterguo/blog/133304

相关知识:

read -u的介绍:https://www.cnblogs.com/maxgongzuo/p/6414474.html

mkfifo管道:https://www.cnblogs.com/maxgongzuo/p/6414466.html

eval和exec:https://www.cnblogs.com/maxgongzuo/p/6414453.html

#!/bin/bash
#author : peterguo@tencent.com
#date : 2013.05.24 #sub process do something
function a_sub_process {
echo "processing in pid [$$]"
sleep 1
} #创建一个fifo文件
FIFO_FILE=/tmp/$.fifo
mkfifo $FIFO_FILE #关联fifo文件和fd6
exec 6<>$FIFO_FILE # 将fd6指向fifo类型
rm $FIFO_FILE #最大进程数
PROCESS_NUM=4 #向fd6中输入$PROCESS_NUM个回车
for ((idx=0;idx<$PROCESS_NUM;idx++));
do
echo
done >&6 #处理业务,可以使用while
for ((idx=0;idx<20;idx++));
do
read -u6 #read -u6命令执行一次,相当于尝试从fd6中获取一行,如果获取不到,则阻塞
#获取到了一行后,fd6就少了一行了,开始处理子进程,子进程放在后台执行
{
a_sub_process && {
echo "sub_process is finished"
} || {
echo "sub error"
}
#完成后再补充一个回车到fd6中,释放一个锁
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &
done #关闭fd6
exec 6>&-

关于例3,在实际应用中,进行了一些更改。

#!/bin/bash
####### env ########
first_taskid=1
PROCESS_NUM=3 ####### func ########
function do_process {
local taskid=$2
[ $taskid -eq 1 ] && local gpuid=0
[ $taskid -eq 2 ] && local gpuid=1
[ $taskid -eq 3 ] && local gpuid=3
sh tran.sh $1 $taskid $gpuid &
hang $1 $taskid $gpuid
# wait
# echo >&6
} function hang {
while true
do
sleep 1800
ps -ef|grep "sh tran.sh $1 $2 $3" |grep -v grep
[ $? -eq 0 ] && continue || break
done
echo >&6
} ######## fifo ########
FIFO_FILE=$(mktemp) # 建立一个随机的不重名的临时文件
rm $FIFO_FILE
mkfifo $FIFO_FILE
trap "rm $FIFO_FILE" 15
trap "rm $FIFO_FILE" 9
exec 6<>$FIFO_FILE for ((idx=0;idx<$PROCESS_NUM;idx++));
do
echo
done >&6 ######## main ##########
for i in `cat tmp.txt`
do
read -u6
taskid=$(( $first_taskid % $PROCESS_NUM ))
[ $taskid -eq 0 ] && taskid=$PROCESS_NUM
do_process $i $taskid &
((first_taskid++))
done ######## end #########
exec 6>&- # 关闭fd6
rm $FIFO_FILE

shell——wait与多进程并发的更多相关文章

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

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

  2. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  3. python多进程并发和多线程并发和协程

    为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...

  4. python进阶(一) 多进程并发机制

    python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...

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

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

  6. python 多进程并发与多线程并发

    本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...

  7. Appium+python自动化(三十六)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 上(超详解)

    简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...

  8. linux 多进程并发服务__关于子进程回收的方法

    以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...

  9. 转 shell中的多进程【并发】

    原文地址https://bbs.51cto.com/thread-1104907-1-1.html 根据我个人的理解, 所谓的多进程 只不过是将多个任务放到后台执行而已,很多人都用到过,所以现在讲的主 ...

随机推荐

  1. TortoiseGit使用技巧

    汇总TortoiseGit使用技巧,包括提交代码,创建patch等等. 1.提交代码到本地仓库 在Git工程目录下右键, 点击 Git Commit -> "master". ...

  2. python 使用demical模块四舍五入

    前言: 断言部分需要用到四舍五入,首先使用的是python自带的round(),做四舍五入进位处理,但使用过程中,发现round似乎是当保留小数位的最后一位是偶数,和保留小数位后一位为5时,就不进位. ...

  3. 工厂模式(python)

    以字符串作为传递参数 以类名作为传递参数 来自为知笔记(Wiz)

  4. nginx 超时时间配置说明

    做excel文件导入时 报 504 错误 是nginx网关超时导致 下面几个参数貌似没效果,反正我配置不起作用 这是有问题的配置属性 ,注意   于是我换了配置 ,放在http块里 ,配置生效了 #读 ...

  5. jsp使用${}语法,对应的spring后台使用Model

    实现的前提,一定要在jsp文件顶部加上 <%@page isELIgnored="false" %> 如上图${aa}与${bb},是直接使用Model的key值对应的 ...

  6. MySQL提权之mof提权

    mof提权原理 关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次 ...

  7. HTML、CSS、Javascript、jQuery、Xml

    HTML HTML简介 Hyper Text Markup Language (超文本标记语言)简写:HTML.通过标签来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加 ...

  8. Java中:接口,抽象类,内部类

    Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...

  9. java基础05-类型转换

    java基础05-类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换. 低 ---------------------------> 高 byte , short , ...

  10. kafka入门(采坑)笔记

    前言 之前在工作和学习过程中也会有记笔记的习惯,但是没有发布出来,也因最近各方面的瓶颈急需突破和提升,所以还是要很积极的融入大环境大生态中,好废话不多说,说下这次遇到的问题 第一步启动zk 根据教程安 ...