shell多線程之進程間通信(2)
阿新 • • 發佈:2018-11-02
操作系統 依次 echo 圖片 tmp end 進行 自己的 linu
工作中往往遇到這種情況,有許多任務,依次執行比較浪費時間,由於任務之間有依賴關系,簡單的並發執行又不行。
就如同下面這種情況,任務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 exec9<>/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>&-
shell多線程之進程間通信(2)