題主應該聽說過下面這些名詞:
- 阻塞IO
- 非阻塞IO
- 同步IO
- 非同步IO
- 同步阻塞IO
- 同步非阻塞IO
- 非同步阻塞IO
- 非同步非阻塞IO
只要理解了這些,你就能理解webflux的非阻塞了!
一個IO操作其實有兩個步驟:發起IO請求和實際的IO操作
阻塞IO和非阻塞IO的區別在於第一個步驟是否阻塞:發起IO請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞IO;如果不阻塞,那麼就是非阻塞IO
同步IO和非同步IO的區別就在於第二個步驟是否阻塞:如果實際的IO讀寫阻塞請求程序,那麼就是同步IO,因此阻塞IO、非阻塞IO、IO複用、訊號驅動IO都是同步IO;如果不阻塞,而是作業系統幫你做完IO操作再將結果返回給你,那麼就是非同步IO
舉個不太恰當的例子 :比如你家網路斷了,你打電話去中國電信報修!
- 你撥號---客戶端連線伺服器
- 電話通了---連線建立
- 你說:“我家網斷了,幫我修下”---傳送訊息
- 說完你就在那裡等,那麼就是阻塞IO
- 如果正好你有事,你放下電話,然後處理其他事情了,過一會你來問下,修好了沒---那就是非阻塞IO
- 如果客服說:“馬上幫你處理,你稍等”---同步IO
- 如果客服說:“馬上幫你處理,好了通知你”,然後掛了電話---非同步IO
SpringMVC5以前,一個請求過來後的流程大致是這樣的:
服務端接收到請求,從執行緒池獲取一個執行緒來處理
執行緒處理完成後,返回資料
執行緒被釋放回執行緒池中
可以看到,當一個請求過來後,所有的處理結束後才會得到響應。
Webflux基於Reactor模型,一個主從Reactor模型如下圖:
主Reactor用於響應連線請求,接收到請求後就分配一個channel,然後直接響應客戶端
從Reactor用於處理IO操作請求,但是不處理具體邏輯
具體邏輯由工作執行緒去處理。工作執行緒處理完成後再去通知響應。
題主應該聽說過下面這些名詞:
- 阻塞IO
- 非阻塞IO
- 同步IO
- 非同步IO
- 同步阻塞IO
- 同步非阻塞IO
- 非同步阻塞IO
- 非同步非阻塞IO
只要理解了這些,你就能理解webflux的非阻塞了!
IO一個IO操作其實有兩個步驟:發起IO請求和實際的IO操作
阻塞IO和非阻塞IO的區別在於第一個步驟是否阻塞:發起IO請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞IO;如果不阻塞,那麼就是非阻塞IO
同步IO和非同步IO的區別就在於第二個步驟是否阻塞:如果實際的IO讀寫阻塞請求程序,那麼就是同步IO,因此阻塞IO、非阻塞IO、IO複用、訊號驅動IO都是同步IO;如果不阻塞,而是作業系統幫你做完IO操作再將結果返回給你,那麼就是非同步IO
舉個不太恰當的例子 :比如你家網路斷了,你打電話去中國電信報修!
- 你撥號---客戶端連線伺服器
- 電話通了---連線建立
- 你說:“我家網斷了,幫我修下”---傳送訊息
- 說完你就在那裡等,那麼就是阻塞IO
- 如果正好你有事,你放下電話,然後處理其他事情了,過一會你來問下,修好了沒---那就是非阻塞IO
- 如果客服說:“馬上幫你處理,你稍等”---同步IO
- 如果客服說:“馬上幫你處理,好了通知你”,然後掛了電話---非同步IO
回到問題SpringMVC5以前,一個請求過來後的流程大致是這樣的:
服務端接收到請求,從執行緒池獲取一個執行緒來處理
執行緒處理完成後,返回資料
執行緒被釋放回執行緒池中
可以看到,當一個請求過來後,所有的處理結束後才會得到響應。
Webflux基於Reactor模型,一個主從Reactor模型如下圖:
主Reactor用於響應連線請求,接收到請求後就分配一個channel,然後直接響應客戶端
從Reactor用於處理IO操作請求,但是不處理具體邏輯
具體邏輯由工作執行緒去處理。工作執行緒處理完成後再去通知響應。