shell多线程之进程间通信(2)
工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行。
就如同下面这种情况,任务new和dvidUser是可以并发执行的,fact任务依赖于new任务,fact执行完之后last和stat才能执行;
dvidUser执行完之后dvid和User两个任务才能执行。
针对这种情况,我考虑了操作系统中的信号量机制,通过借助linux中的文件描述符(以下称pipe)来实现这几个任务的并发。
当new执行完之后,向pipe-7中写入自己当前执行的ID(在程序中用$i标识,递增的),然后ID自增,继续执行;
与此同时,fact任务不断从pipe-7中读取,我们称之为$j,然后和自己的任务ID进行比较,会有几种情况:
1.没有读到$j,说明相同ID的前置new任务尚未执行,则fact阻塞;
2.读到$j,$j>ID,fact执行,fact执行完之后将自己的ID同时写入pipe-8和pipe-9),以通知它的后置任务last和stat.
其他的逻辑基本相同。代码如下:
init_pipe.sh
# 初始化file descriptor
init_pipe(){
[ -e /tmp/fd1001 ] || mkfifo /tmp/fd1001
exec <>/tmp/fd1001
rm -rf /tmp/fd1001 [ -e /tmp/fd1002 ] || mkfifo /tmp/fd1002
exec <>/tmp/fd1002
rm -rf /tmp/fd1002 [ -e /tmp/fd1003 ] || mkfifo /tmp/fd1003
exec <>/tmp/fd1003
rm -rf /tmp/fd1003 [ -e /tmp/fd1004 ] || mkfifo /tmp/fd1004
exec <>/tmp/fd1004
rm -rf /tmp/fd1004 [ -e /tmp/fd1005 ] || mkfifo /tmp/fd1005
exec <>/tmp/fd1005
rm -rf /tmp/fd1005 [ -e /tmp/fd1006 ] || mkfifo /tmp/fd1006
exec <>/tmp/fd1006
rm -rf /tmp/fd1006 } destroy_pipe(){
exec <&-
exec >&-
exec <&-
exec >&-
exec <&-
exec >&-
exec <&-
exec >&-
exec >&-
exec <&-
exec <&-
exec >&-
}
work.sh
# 初始化file descriptor
#source init_pipe.sh source执行脚本,两个脚本在同一个进程中,执行脚本中的环境变量都可以带到主脚本。
# ‘.’=fork,开启一个新的子shell,子shell执行完之后返回父shell,不能带回自己的环境变量;
. init_pipe.sh
newFun(){
for((i=;i<;i++))
do
echo 'new'$i
sleep
echo $i >&
done
} factFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'fact'$i
echo $i>&
echo $i>&
echo $i>&
fi
sleep
done
} lastFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'last'$i
fi
sleep
done
} statFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'stat'$i
fi
sleep
done
}
retainFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'retain'$i
fi
sleep
done
} dvidUserIdFun(){
for((i=;i<;i++))
do
echo 'dvidUserId'$i
echo $i>&
echo $i>&
sleep
done
} dvidFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'dvid'$i
fi
sleep
done
} userIdFun(){
for((i=;i<;i++))
do
read -u j
if [ $i -le $j ];then
echo 'userId'$i
fi
sleep
done
}
###################################################
init_pipe
start_time=`date +%s`
newFun &
factFun &
lastFun &
statFun &
retainFun &
dvidUserIdFun &
dvidFun &
userIdFun &
wait
end_time=`date +%s`
echo "TIME:[[ $end_time - $start_time]]" destroy_pipe
shell多线程之进程间通信(2)的更多相关文章
- shell多线程之进程间通信(3)
之前的文章依赖是1对1或1多对的,但每个任务的前置任务都只有1个. 本文的核心在于一个任务依赖于多个任务的执行完成,如上图所示,这个任务就是fact,只有new和dviduser两个任务都完成的情况下 ...
- shell多线程之进程间通信
# 这是一个简单的并发程序,有如下要求: # .有两个程序a和b,希望他们能并发执行,以节约时间 # .a和b都是按照日期顺序执行,但b每日程序的前提条件是当日a的程序已经执行完毕 #解决方案: # ...
- [shell进阶]——shell多线程
关于shell的多线程 1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效 2. Shell并没有多线程的概念,所以: * 一般使用wait.read等命令技巧性地模拟多线程实 * 使用命 ...
- shell多线程,wait
文章来源,wait的使用效果还是不错的 最近在使用shell做一些部署工作,在使用过程中,效率一直不高.想提高效率,经过分析发现,并不是所有操作都是需要串行的,一些操作是可以进行并行操作的.经过学习, ...
- shell多线程(2)之基于管道实现并发
在shell脚本里批量执行程序是比较常见的方式,如果程序很多,每个执行时间比较长,则顺序执行需要花费大量的时间. 此时并发就成为我们考虑的方向. 上篇<shell多线程>中我们已经简单实现 ...
- linux shell 多线程执行程序
Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能. 直接看代码示例吧. (1) 顺序执行的代码 #!/bin/bash date ` do { echo & ...
- Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
同一接口不同的数据源: 协同进程: fdopen以文件描述符为参数: fopen和popen: 为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell ...
- [转]linux shell 多线程实现
情景 shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时.因为默认情况下,shell脚本中的命令是串行执行的.如果这些命令相互之间是独立的,则可以使用“并发 ...
- shell 命名管道,进程间通信
命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...
随机推荐
- 报错:javax.servlet.jsp.PageContext cannot be resolved to a type;javax.servlet.jsp.JspException cannot be resolved to a type
Multiple annotations found at this line: - javax.servlet.jsp.PageContext cannot be resolved to a typ ...
- redis 学习笔记——持久化
redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...
- vs中添加MySql实体集流程
默认情况下只有下图: 首先需要下载mysql为vs和ef提供的驱动(可以去官网下载对应的版本) 然后打开vs开始添加实体类 首先在NuGet中安装MySql.Data和MySql.Data.Entit ...
- 嵌套函数中的this
function countDown(){ var self = this; var doWork = function(){ console.log(this);//window console.l ...
- Variability aware wear leveling
Techniques are presented that include determining, for data to be written to a nonvolatile memory, a ...
- Win7 32bit下一个hadoop2.5.1源代码编译平台的搭建各种错误遇到
从小白在安装hadoop困难和错误时遇到说起,同时,我们也希望能得到上帝的指示. 首先hadoop更新速度非常快,最新的是hadoop2.5.1,因此就介绍下在安装2.5.1时遇到的各种困难. 假设直 ...
- 距离北京奥运还有359天,发布WPF版本的北京2008标志(下)
原文:距离北京奥运还有359天,发布WPF版本的北京2008标志(下) 图片显示效果: XAML代码: <Viewbox Width="463.548828" Height ...
- 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)
曾梦想仗剑走天涯,看一看世界的繁华 年少的心有些轻狂,如今你四海为家 曾让你心疼的姑娘,如今已悄然无踪影 犹记得上大学攒钱买了第一台智能手机Lumia 520时,下载的第一首歌曲<曾经的你> ...
- 将python3.1+pyqt4打包成exe
将python打包成exe的程序有很多,比如py2exe.PyInstaller等等,但是到目前为止,它们对python3.1支持的都不好,所以这里我要介绍一下cx_freeze 4.2.2,它还能支 ...
- 受限玻尔兹曼机(RBM)以及对比散度(CD)
1. RBM 的提出 BM 的缺点: 计算时间漫长,尤其是无约束自由迭代的负向阶段: 对抽样噪音敏感: 流行软件的不支持: 受限玻尔兹曼机(Restricted Boltzmann Machine,简 ...