伺服器 Reactor 模式

2021-08-17 06:02:49 字數 917 閱讀 8493

併發性不是太高伺服器程式使用這個模式基本就可以滿足。

主線程只負責監聽檔案描述上是否有事件,如果有就立即將該事件通知到工作執行緒。讀寫資料、接受新的連線以及處理客戶端的訊息都在工作執行緒。

工作流:

1)主線程往 epoll 核心事件表中註冊 socket 上的讀就緒事件

2)主線程呼叫 epoll_wait 等待 socket 上有資料可讀

3)當 socket 上有資料可讀時, epoll_wait 通知主線程。主線程則將 socket 可讀事件放入請求佇列。

4)睡眠在請求佇列上的某個工作執行緒被喚醒,他從 socket 讀取資料,並處理客戶請求,然後往 epoll 核心事件表中註冊該socket 上的寫就緒時間。

5)主線程呼叫 epoll_wait 等待 socket 可寫。

6)當 scoket 可寫, epoll_wait 通知主線程。主線程將 socket 可寫事件放入請求佇列。

7)睡眠在請求佇列上的某個工作執行緒被喚醒,它往 socket 上寫入伺服器處理客戶端請求的結果。

公司遊戲後端架構基本遵循此工作流:

主線程是乙個迴圈,每一幀使用 epoll_wait 等待事件發生,有可讀寫事件或請求連線事件時處理這些事件,將可讀事件的內容 recv出來建立乙個訊息物件,放入事件處理佇列中,只不過請求連線事件是直接在主線程處理的。

cmain 物件初始化時就建立 pack_deal 工作執行緒池。工作執行緒則每一幀從工作佇列裡取出訊息物件及 sock 進行處理,處理完之後再寫入乙個訊息物件放在佇列中,再由主線程 send 出去。

主要不同是讀取和傳送還有建立連線是在主線程,然後工作執行緒池容量可以在 配置檔案 .conf 中配置,日常只是配置乙個。

Reactor模式(反應器模式)

reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...

設計模式 反應器(Reactor)模式

從學習zeromq說起 zeromq幾乎所有的i o操作都是非同步的,主線程不會被阻塞。zeromq會根據使用者呼叫zmq init函式時傳入的介面引數,建立對應數量的i o thread。每個i o thread都有與之繫結的poller,poller採用經典的reactor模式實現,poller...

Reactor反應器模式 epoll

最近在看redis原始碼,主體流程看完了。在網上看到了reactor模式,看了一下,其實我們經常使用這種模式。反應器設計模式 reactor pattern 是一種為處理併發服務請求,並將請求提交到乙個或者多個服務處理程式的事件設計模式。當客戶端請求抵達後,服務處理程式使用多路分配策略,由乙個非阻塞...