非同步任務佇列的兩種處理方法

2021-08-09 02:52:21 字數 1005 閱讀 9185

先對這裡的非同步任務做下解釋: 這裡的意思是,該任務有幾種狀態,建立,等待,執行,結束;其中等待是因為,該任務要正常執行,需要其他執行緒(或程序)提供相應的條件(或觸發事件),然後才會執行。    針對這種要非同步處理(等待)的任務佇列管理模式,個人理解有兩種處理方法。

第一種: 

也是最常規的一種,定義乙個佇列,建立任務,然後push到佇列裡面去,每個任務建立之後,(或接到開啟命令)啟動等待(定時器),等待所需條件(或事件),如果等待,那麼就正常執行,然後結束,如果超時,那麼就直接結束。  

這種方法的缺點就是,必須要有等待(定時器),這會消耗資源,影響效率。

優點就是不會有任務丟失。

第二種:

定義乙個定長(較大)的任務陣列, 任務全部初始化為建立狀態,當有乙個任務來的時候,那麼就查詢陣列中free的任務obj,注意這裡查詢,要從上乙個已經使用的index往後查,(比如,現在已經存了3個有效任務,每次使用乙個新的,都會記錄index, 那麼index應該等於2,那麼要查詢未被使用的任務obj,這裡應該從index=3開始查,這樣就不會把之前的任務沖掉) ,查的時候,只要狀態不是在執行就可以。   注意:這裡其實已啟用的任務,可能是出於等待狀態的,那麼當它的執行條件(事件)來的時候,那麼就要從之前已經存的啟動任務中去找(這裡要從記錄的index往前找,因為我們記錄的順序是從前往後的,前面的都是在等待或者已經執行了的),當找到後,就將任務狀態改為執行。

這裡寫的有些含糊,但是只要細細理解,應該就能明白,這其實就是乙個迴圈利用一開始就申請好的陣列佇列。

這中方法的優點就是 不用啟用定時器,節省資源,效率高,且不會有殭屍任務(比如方法一種如果沒有定時器,那麼就有可能出現一直在等待的任務)出現。 缺點就是,最多只能有一開始建立的陣列大小個任務並行(這個缺點,可以通過變長陣列,或vector解決),還有乙個缺點就是,有可能會有前面的等待任務,誤被當做free任務obj而被沖掉,所以這種方法適合那種快速響應的非同步任務(就是它建立了,它對應的啟動執行條件很快就會來,等待時間很短)。

兩種方法各有優缺點,需根據不同情況選擇。

迴圈佇列的兩種實現方法

順序儲存結構 示意圖參考嚴蔚敏版 資料結構 順序儲存為何宜選迴圈佇列?佇列的順序表儲存中,除了資料域dat adata data 還應附設兩個座標fro ntfront front和rea rrear rear 用來記錄頭結點和尾結點的位置。對於pop poppo p操作,依靠 fro nt 1 f...

Table的兩種處理方法記錄

簡單記錄一下,方便以後參考 基於jquery實現 一種是滾輪,一種是翻頁 滾輪的 實現 ip位址 埠例項型別 慢操作總數 slowline ms 連線詳情 let rowstr 檢視 翻頁的 實現 慢操作發生時刻 慢操作指令 慢操作次數 慢操作平均耗時 ms 初始化例項 以免出現寬度的問題 func...

兩種常用的佇列

與棧相反,佇列是一種先進先出的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。和線性表類似,佇列也可以有兩種儲存表示。用鍊錶表示的佇列簡稱鏈佇列。下面是帶頭結點的單鏈佇列的實現 1 include 2 include 34 typedef char qelemtype 5 單鏈佇列節點 6 ...