libuv事件迴圈中的三種控制代碼

2022-01-17 05:53:01 字數 3560 閱讀 9829

本文會簡單介紹libuv的事件迴圈,旨在入門級別的使用,而不做深入**,簡單來說就是,會大概用就行,先用熟練了,再去**原理和原始碼

下圖為官網的libuv的不同部分及其涉及的子系統的圖:

libuv使用handlesrequests來結合使用事件迴圈

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_tidle控制代碼型別

該方法永遠執行成功,返回值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_tprepare控制代碼型別

返回值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_tcheck控制代碼型別

方法執行總是成功的

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匹配,就執行語句...