shell指令碼實現多併發 mkinfo

2021-10-08 07:47:50 字數 1965 閱讀 8175

以下為**實現的乙個模擬場景:

3個生產者,在不斷提供服務,處理需求,假設1s處理乙個。

20個消費者,在不斷消耗供給產品,提交需求,假設3s消耗乙個。

情景分析:由於消費者的提交需求能力 和 生產者處理需求的能力 不對等,於是出現了供不應求的供銷矛盾。

問題:一般情況下,在供不應求時,會有大量的需求被掛起,也就是排隊,排隊期間消費者不得離開,否則當前所處的佇列順序就被後面的消費者替代。這樣所有排隊的消費者都無法幹別的事,只能空等,模擬作業系統中記憶體、計算單元等資源被空佔,影響整體效率。

解決思路:通過佇列來提前收取需求,類似於自動幫消費者記錄排隊順序,這樣等輪到自己時,再去執行。那麼節省出來的等待時間,就可以去做別的事情,模擬作業系統中資源釋放。

#!/bin/bash

iplist=/home/meta/ipinfo/iplist #任務(消費者)

thread=50 #宣告併發執行緒併發個數,這個是此應用的關鍵,也就是設定管道的最大任務數

tmpfifo=/tmp/$$.fifo #宣告管道名稱,'$$'表示指令碼當前執行的程序pid

mkfifo $tmpfifo #建立管道

exec 5<>$ #建立檔案標示符「5」,這個數字可以為除「0」、「1」、「2」之外的所有未宣告過的字元, 以讀寫模式操作管道檔案;系統呼叫exec是以新的程序去代替原來的程序,但程序的pid保持不變, 換句話說就是在呼叫程序內部執行乙個可執行檔案

rm -rf $ #清除建立的管道檔案

#為併發執行緒建立同樣個數的佔位

for((i=1;i<=$thread;i++))

do echo ; /*借用read命令一次讀取一行的特性,使用乙個echo預設輸出乙個換行符,來確保每一行只有乙個執行緒佔位;

這裡讓人聯想到生產者&消費者模型,管道檔案充當訊息佇列,來記錄消費者的需求,然後由生產者去領任務,並完成任務,

這裡運用了非同步解耦的思想*/

done >&5

#將佔位資訊寫入管道

for i in $(cat $ |grep -vie "^#|備機|ts"|awk '') #從任務佇列中依次讀取任務

do read -u5 /*從檔案描述符管道中,獲取乙個管道的執行緒佔位然後開始執行操作;read中 -u 後面跟fd,表示從檔案描述符中讀入,

該檔案描述符可以是exec新開啟的*/

');ssh -oconnecttimeout=10 -oconnectionattempts=3 $i "cd /home/log/;grep 'mil' mission_2016-08-03*.log |awk -f, ''|

awk -f, ''>miss_info.txt"

echo "" >&5 /*任務執行完後在fd5中寫入乙個佔位符,以保證這個執行緒執行完後,執行緒繼續保持佔位,繼而維持管道中永遠是50個執行緒數,

&表示該部分命令/任務放入後台不佔當前的bash,實現並行處理*/

} &done

wait #等待父程序的子程序都執行結束後再結束父程序

exec 5>&- #關閉fd5的管道

exit 0

#!/bin/bash

old_ifs=$ifs #儲存原始值

ifs="" #改變ifs的值

......

ifs=$old_ifs #還原ifs的原始值

ifs=』\n』 //將字元\和字元n作為ifs的換行符。

ifs=』\n』 //與上面一樣。

ifs=$』\n』 //正真的使用換行符做為字段分隔符。

shell指令碼的併發

2016年05月09日 17 06 28 閱讀數 1680 default模式下,shell命令是阻塞執行的,可以通過其後新增 讓這條命令非同步執行,如 sleep 10 執行這條命令後,並不會阻塞10秒,而是立即返回。如果將這種方法用在while迴圈中,則可以實現多程序並行處理。例如一下test1...

Shell指令碼中的併發

主要記錄一下shell指令碼中的命令的併發和序列執行。預設的情況下,shell指令碼中的命令是序列執行的,必須等到前一條命令執行完後才執行接下來的命令,但是如果我有一大批的的命令需要執行,而且互相又沒有影響的情況下 有影響的話就比較複雜了 那麼就要使用命令的併發執行了。看下面的 bin bash f...

shell指令碼併發控制詳解

file descriptors fd,檔案描述符或檔案控制代碼 程序使用檔案描述符來管理開啟的檔案 檢視當前程序的fd 確定以下三點 如何exec開啟乙個檔案 exec 3 file1.txt 如何exec關閉乙個檔案 釋放檔案控制代碼 如果沒有釋放控制代碼,檔案刪除後描述符依然還在 exec 3...