标签:div info 之间 tar http 通知 .com bsp fun
工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行。
就如同下面这种情况,任务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.
其他的逻辑基本相同。代码如下:
[ -e /tmp/fd7 ] || mkfifo /tmp/fd7 exec 7<>/tmp/fd7 rm -rf /tmp/fd7 [ -e /tmp/fd8 ] || mkfifo /tmp/fd8 exec 8<>/tmp/fd8 rm -rf /tmp/fd8 [ -e /tmp/fd9 ] || mkfifo /tmp/fd9 exec 9<>/tmp/fd9 rm -rf /tmp/fd9 [ -e /tmp/fd5 ] || mkfifo /tmp/fd5 exec 5<>/tmp/fd5 rm -rf /tmp/fd5 [ -e /tmp/fd6 ] || mkfifo /tmp/fd6 exec 6<>/tmp/fd6 rm -rf /tmp/fd6 newFun(){ for((i=0;i<10;i++)) do echo ‘new‘$i sleep 1 echo $i >& 7 done } factFun(){ for((i=0;i<10;i++)) do read -u 7 j if [ $i -le $j ];then echo ‘fact‘$i echo $i>& 8 echo $i>& 9 fi sleep 1 done } lastFun(){ for((i=0;i<10;i++)) do read -u 8 j if [ $i -le $j ];then echo ‘last‘$i fi sleep 1 done } statFun(){ for((i=0;i<10;i++)) do read -u 9 j if [ $i -le $j ];then echo ‘stat‘$i fi sleep 1 done } dvidUserIdFun(){ for((i=0;i<10;i++)) do echo ‘dvidUserId‘$i echo $i>& 5 echo $i>& 6 sleep 1 done } dvidFun(){ for((i=0;i<10;i++)) do read -u 5 j if [ $i -le $j ];then echo ‘dvid‘$i fi sleep 1 done } userIdFun(){ for((i=0;i<10;i++)) do read -u 6 j if [ $i -le $j ];then echo ‘userId‘$i fi sleep 1 done } ################################################### start_time=`date +%s` newFun & factFun & lastFun & statFun & dvidUserIdFun & dvidFun & userIdFun & wait end_time=`date +%s` echo "TIME:[[ $end_time - $start_time]]" exec 7<&- exec 7>&- exec 8<&- exec 8>&- exec 9<&- exec 9>&- exec 5>&- exec 5<&- exec 6<&- exec 6>&-
标签:div info 之间 tar http 通知 .com bsp fun
原文地址:https://www.cnblogs.com/wangbin2188/p/9897694.html