Nginx學習筆記之事件驅動框架處理流程

2021-09-11 23:28:30 字數 883 閱讀 4911

nginx對請求的處理是通過事件觸發的,模組作為事件消費者,只能被事件收集、分發器呼叫。在nginx中,接收到乙個請求時,不會產生乙個單獨的程序來處理該請求,而是由事件收集、分發器(程序)呼叫某個模組,由模組處理請求,處理完後再返回到事件收集、分發器

ngx_event_core_module模組的ngx_event_process_init方法對事件模組做了一些初始化。其中包括將「請求連線」這樣乙個讀事件對應的處理方法(handler)設定為ngx_event_accept函式,並將此事件新增到epoll模組中。當有新連線事件發生時,ngx_event_accept就會被呼叫。大致流程是這樣:

ngx_process_events_and_timers會呼叫ngx_process_events,這是乙個巨集,相當於ngx_event_actions.process_events,ngx_event_actions是個全域性的結構體,儲存了對應事件驅動模組(這裡是epoll模組)的10個函式介面。所以這裡就是呼叫了ngx_epoll_module_ctx.actions.process_events函式,也就是ngx_epoll_process_events函式來處理事件。

ngx_epoll_process_events呼叫linux函式介面epoll_wait獲得「有新連線」這個事件,然後呼叫這個事件的handler處理函式來對這個事件進行處理。

在上面已經說過handler已經被設定成了ngx_event_accept函式,所以就呼叫ngx_event_accept進行實際的處理。

下面分析ngx_event_accept方法,它的流程圖如下所示:

經過精簡的**如下,注釋中的序號對應上圖的序號:

C 學習筆記之 事件 Event

發布器 publisher 是乙個包含事件和委託定義的物件。事件和委託之間的聯絡也定義在這個物件中。發布器 publisher 類的物件呼叫這個事件,並通知其他的物件。訂閱器 subscriber 是乙個接受事件並提供事件處理程式的物件。在發布器 publisher 類中的委託呼叫訂閱器 subsc...

uC OS II 之事件控制塊學習筆記

uc os ii 之事件控制塊學習筆記 一.事件控制塊ecb資料結構 typedef struct os event 二 關鍵演算法 1,將乙個任務插入到等待事件的任務列表中 當呼叫函式os eventtaskwait 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表...

React學習筆記之事件處理(二)

react的事件處理和dom的事件處理是很相似的,只是有一些語法上的區別 舉個例子 而且如果你想拿到事件物件event,這個物件是react按照w3c標準完成的,所以不用擔心瀏覽器的相容性,可以程式設計客棧像如下這樣 function actionlink return click me 如果用es...