前面使用epoll_wait將就緒事件從核心讀取到使用者陣列裡之後,需要處理事件。其中包括對超時事件的處理。
tk_handle_expire_timers();
tk_pq_t tk_timer;//優先佇列是全域性變數
void tk_handle_expire_timers()
// 最早入佇列節點超時時間大於當前時間(未超時)結束超時檢查
if(timer_node->key > tk_current_msec)
// 出現了沒被刪但是超時的情況,呼叫handler處理
if(timer_node->handler)
int rc = tk_pq_delmin(&tk_timer);
free(timer_node);
}}int tk_pq_is_empty(tk_pq_t *tk_pq)
void *tk_pq_min(tk_pq_t *tk_pq)
typedef struct priority_queuetk_pq_t;
typedef struct tk_timer tk_timer_t;
// 函式指標,負責超時處理,tk_add_timer時指定處理函式
//定義了乙個新型別timer_handler_pt,這種型別指向了某種函式,這種函式傳入引數為:tk_http_request_t* request
//返回值型別為int
void tk_del_timer(tk_http_request_t* request)
優先佇列儲存時間結點。時間結點包含請求截止時間,是否被刪除,以及超時處理函式,還有請求結構體。只要優先佇列不為空,就不斷獲取優先佇列對頭結點,檢視惰性標記,已標記則釋放記憶體;未標記,則檢視時間是否超時,超時了,則呼叫超時處理函式,將該結構體的惰性標記置1,並將該節點放到優先佇列尾部。沒超時不做任何操作。
檢視該節點惰性標記是否為1,是則釋放該節點記憶體空間,返回;
檢視該節點是否超時,沒有超時,則什麼都不做,返回;
超時,則,對該節點進行惰性標記,且將該超時節點移至隊尾。
int tk_pq_delmin(tk_pq_t *tk_pq)
return 0;
}void exch(tk_pq_t *tk_pq, size_t i, size_t j)
int sink(tk_pq_t *tk_pq, size_t k)
return k;
}
將該節點與尾節點交換位置
對尾節點實行下溢操作,該操作會將該節點與兩個孩子節點中的較小者比較,與比它小則交換,否則終止交換。
Vue專案請求超時處理
現在網頁專案大多採用前後端分離模式,這種模式優點有很多,但是也會帶來不少問題,比如 請求後端介面時會受網路因素影響,導致請求超時 這就需要我們在請求方法中設定攔截,對請求超時做處理 下面就是我在專案中使用的axios封裝方法,設定網路請超時攔截處理 api 路徑 const httpaxios ax...
axios 請求超時處理方法
main.js import axios from axios axios.defaults.timeout 10000 設定超時時間,單位毫秒 axios.defaults.retry 3 設定全域性請求次數 axios.defaults.retrydelay 1000 設定全域性請求間隙 htt...
AJAX學習筆記之 處理多個非同步請求
首先來看乙個例項 9 5.html 9 5.aspx response.write request otext 執行效果 第乙個請求被覆蓋 出現這個問題是xmlhttp被作為乙個全域性變數而存在,第乙個請求未完成,已經被之後的請求所覆蓋。解決方法是將xmlhttp物件作為區域性變數來處理,並且在收到...