本文會簡單介紹libuv的事件迴圈,旨在入門級別的使用,而不做深入**,簡單來說就是,會大概用就行,先用熟練了,再去**原理和原始碼
下圖為官網的libuv的不同部分及其涉及的子系統的圖:
libuv使用handles和requests來結合使用事件迴圈
handles表示能夠執行某些耗時的長時間存在的物件
requests表示短暫的操作,可以在乙個handles上執行
下圖為官網的事件迴圈:
這張圖其實表明了libuv中的時間迴圈的處理過程,也就是uv_run()方法執行的過程,該方法內部是乙個while迴圈:
先判斷迴圈是都處於活動狀態,通過判斷當前是否處於 alive 狀態,來確定事件迴圈是否退出;
執行倒計時定時器(維護所有控制代碼的定時器);
執行待執行的**函式;
執行idle控制代碼;
執行prepare控制代碼;
輪詢 i/o;
執行check控制代碼;
呼叫 close **;
上述步驟中,有三個控制代碼被重點標出,我們就來討論這三個控制代碼
idle handle即空閒控制代碼,從上面流程圖上可以看出,如果啟動了idle handle,每次事件迴圈的時候都會執行一遍其**
該方法用於初始化idle handle
int uv_idle_init(uv_loop_t* loop, uv_idle_t* idle)
uv_idle_t是idle控制代碼型別
該方法永遠執行成功,返回值0
該方法用於開始idle handle
int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb)
該方法用於都是執行成功的(返回值0),除非**函式設定為 null(此時返回uv_einval)
**函式宣告如下:
void (*uv_idle_cb)(uv_idle_t* handle);
**函式會把控制代碼帶過去
該方法用於停止idle handle
int uv_idle_stop(uv_idle_t* idle)
該方法永遠執行成功,返回值0
執行之後,**不會再執行
可以理解成準備控制代碼,從流程圖中可以看出,在idle之後,在輪詢 io 之前執行其**
其api和idle差不多
int uv_prepare_init(uv_loop_t* loop, uv_prepare_t* prepare);
初始化控制代碼,uv_prepare_t為prepare控制代碼型別
返回值0,總是成功的
int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb);
開始控制代碼,執行總是成功的(返回0),除非**函式為 null(此時返回 uv_einval )
void (*uv_prepare_cb)(uv_prepare_t* handle);
int uv_prepare_stop(uv_prepare_t* prepare);
停止控制代碼,**函式不會再執行
可以理解為檢查控制代碼,如果程式中啟動了check控制代碼,則在每次輪詢 io 之後執行其**函式,正好和prepare前後呼應
這種設計的機制是libuv為使用者預留的藉口,在輪詢 io 迴圈狀態前後進行準備和校驗操作
其 api 和上面兩種控制代碼類似
int uv_check_init(uv_loop_t* loop, uv_check_t* check);
初始化控制代碼,uv_check_t為check控制代碼型別
方法執行總是成功的
int uv_check_start(uv_check_t* check, uv_check_cb cb);
開始控制代碼,**函式可以為 null
方法執行總是成功的(返回0),除非**函式為 null(返回uv_einval )
void (*uv_check_cb)(uv_check_t* handle);
int uv_check_stop(uv_check_t* check);
停止控制代碼,**函式不會再執行
方法執行總是成功的,返回0
#include #include #include #define max_num 3
int count = 0;
void idle_cb(uv_idle_t *handle)
}void prepare_cb(uv_prepare_t *handle)
void check_cb(uv_check_t *check)
int main()
輸出結果如下:
idle handle callback, count = 1
prepare handle callback
check handle callback
idle handle callback, count = 2
prepare handle callback
check handle callback
idle handle callback, count = 3
idle handle stop, count = 3
prepare handle callback
check handle callback
上例子中沒有 io 相關的**,主要用於熟悉三種控制代碼**函式的執行順序 事件迴圈中事件佇列的順序
同步任務 nexttick 函式佇列 微任務 promise 函式佇列 微任務 timeout,interval定時器任務佇列 巨集任務 i o事件任務佇列,如http請求 檔案讀寫等 巨集任務 immediate任務佇列 注 對於當前正在執行任務所產生的的子任務,不管是什麼型別的,都得等當前任務佇...
PHP的三種迴圈
while 只要條件為真就迴圈 for 提前知道迴圈的次數 foreach 用來迴圈陣列,指標控制 和while for控制迴圈次數的條件不同 當物件被foreach的時候,內部的valid,current,key方法會依次被呼叫,其返回的值便是foreach語句的key和value。當一次迴圈體結...
三種迴圈的比較
switch case 語法 switch 表示式 變數 case 值1 語句1 break case 值2 語句2 break default 語句3 break 執行過程 當程式執行到switch 表示式 變數 先判斷括號裡的表示式,執行大括號裡的case 後面的值1 如果和值1匹配,就執行語句...