shell——wait与多进程并发
在脚本里用&后台打开多个子进程,用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与多进程并发的更多相关文章
- Linux Shell多进程并发以及并发数控制
1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- python多进程并发和多线程并发和协程
为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...
- python进阶(一) 多进程并发机制
python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...
- Shell脚本中的并发(转)
转自http://blog.csdn.net/wangtaoking1/article/details/9838571 主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚 ...
- python 多进程并发与多线程并发
本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...
- Appium+python自动化(三十六)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 上(超详解)
简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...
- linux 多进程并发服务__关于子进程回收的方法
以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...
- 转 shell中的多进程【并发】
原文地址https://bbs.51cto.com/thread-1104907-1-1.html 根据我个人的理解, 所谓的多进程 只不过是将多个任务放到后台执行而已,很多人都用到过,所以现在讲的主 ...
随机推荐
- 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通
本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器. 1 windows10 安装 docker 下载docker-desktop ...
- SpringBoot 与 SpringCloud 的版本对应详细信息
"spring-cloud": { "Finchley.M2": "Spring Boot >=2.0.0.M3 and <2.0.0.M ...
- 『无为则无心』Python函数 — 32、递归
目录 1.什么叫递归函数 2.递归的应用场景 3.递归的特点 4.应用:3以内数字累加和 5.应用:阶乘 6.总结 1.什么叫递归函数 Python中,在函数内部,可以调用其他函数.如果一个函数在内部 ...
- webpack 多环境打包
目前来说有两种方案: 方案一: 1.修改build文件夹下build.js文件 添加声明变量 2.修改config文件夹下dev.env.js文件 这个是开发环境所用版本 3.修改config文件夹下 ...
- JAVA-JDK1.8-ConCurrentHashMap-源码并且debug说明
概述 在上述的随笔中已经介绍了JDK1.7版本的ConCurrentHashMap源码和测试了,现在这篇随笔主要介绍JDK1.8版本的ConCurrentHashMap,这个版本抛弃了分段锁的实现,直 ...
- Git使用:版本回退
在Git中,我们可以用 git log命令查看我们修改的历史记录 C:\Users\Administrator\Documents\GitHub\learngit [master]> git l ...
- leetcode 1218. 最长定差子序列
问题描述 给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度. 示例 ...
- echarts的通用属性的介绍
通常做数据可视化时,会用到统计图,这里我使用的是Echarts,对于第一次用的人来说,还是有点难度的,主要是里面的属性太多,看的头痛,这里我自己做个笔记 这里的配置项手册里面就是查找各种属性了,在Ec ...
- java-异常-异常注意事项
1 package p1.exception; 2 3 /* 4 * 异常的注意事项: 5 * 6 * 1,子类在覆盖父类方法时,父类的方法如果抛出了异常, 7 * 那么子类的方法只能抛出父类的异常或 ...
- nginx缓冲区参数配置优化
目录 一:nginx缓冲区优化 1.proxy_buffering 2.proxy_buffer_size 3.proxy_buffers 4.proxy_busy_buffers_size 5.pr ...