1. 程式人生 > >Reactor執行緒模型

Reactor執行緒模型

單執行緒模型(所有的IO操作都由同一個NIO執行緒處理)

在這裡插入圖片描述
原理
上圖,有三個客戶端連線了服務端,在服務端有一個單執行緒。連線都是由這個單執行緒處理的,連線完後需要做一些額外的操作也是由這個單執行緒去處理的。作為服務端,它用於接收客戶端所有的連線。如果作為客戶端,它就會向服務端發起所有的連線。同時,它又可以去讀取請求、響應訊息、傳送請求等。這種執行緒模型其實就是一種非同步非阻塞的IO,所有的IO操作都不會阻塞。理論上這樣的一個單執行緒它是可以獨立去處理所有IO相關的操作。但是這個僅僅只限於一些小型的應用場景,如果遇到高併發、高負載,這樣方式就不太合適了。因為一個NIO執行緒要同時去處理成千上萬的請求,它的效能會支撐不了。

生活案例
我開了一家飯店,然後招了一個服務員,她負責在門口接待客人並且將客人帶進餐廳裡面,再給客人端茶倒水。之後再去門口等著接待另外的客人。隨著生意火爆起來,這個服務員明顯就忙不過來了。她沒法將那麼多的客人一個一個接進餐廳,又一個一個的給他們端茶倒水。

多執行緒模型(由一組NIO執行緒來處理IO操作)

在這裡插入圖片描述
原理
上圖,把原先的Reactor單執行緒拆分成了兩塊:一塊是Reactor單執行緒,另一塊是Reactor執行緒池。Reactor單執行緒只負責處理客戶端的連線,如果有額外的IO操作,則交給Reactor執行緒池來處理。

生活案例
還是飯店這個例子,現在我安排原先的服務員就只負責在門口接待客人,當客人自己進餐廳後,會有其他的服務員來招待他們,給他們端茶倒水。這樣子門口的服務員就輕鬆多了。但是隨著飯店的名氣越來越好,節假日人超級多,滿大街的人都來我飯店吃飯,門口的這個服務員還是招待不過來了。

主從執行緒模型(一組執行緒池接收請求,一組執行緒池處理IO)

在這裡插入圖片描述
原理
上圖,原先的單執行緒變成了主執行緒池,後面處理IO操作的執行緒池變成了從執行緒池。

生活案例
飯店的生意太火爆了,於是我又招了兩個服務員負責在門口接待客人,這樣子不管有多少客人來我飯店,都能把他們接待好。