poll做的本質工作就是監測鏈條上前續Future的執行狀態

發布時間:2021年11月13日 閱讀:438 次

poll做的本質工作就是監測鏈條上前續Future的執行狀態

poll做的本質工作就是監測鏈條上前續Future的執行狀態

不少博主在介紹Rust的Future等異步編程框架時都提到了Rust的Future采用poll模式,不過到底什么是poll模式卻大多語焉不詳,其實poll做的本質工作就是監測鏈條上前續Future的執行狀態。

以上述情況為例,poll的方向是由response到request最后是socket,但是state和data的返回方向是完全返過來的,也就是說response通過poll來獲取request的state,而request也同樣通過poll來獲取socket的state。

筆者還是這樣的觀點,程序員群體之所以覺得future機制難以理解,其關鍵在于思維模式被計算機的各種回調機制給束縛住了,而忘記了最簡單直接的方式。在解決這個問題之前我們先來問一個問題,假如讓我們自己設計一個類似于tokio這樣的異步Future管理器,應該如何入手?

最直接也是最容易想到的方案就是事件循環,定期遍歷整個事件隊列,把狀態是ready的事件通知給對應的處理程序,這也是我們常說的select方案;另外一種做法是在事件poll管理器中直接拿到處理程序的句柄,不再遍歷整個事件隊列,而是直接在中斷處理響應中把通知發給對應處理進程,比如上述例子中實際是按照poll的鏈條傳遞的處理進程句柄的,這就是Poll模式。而基于poll設計的如tokio框架進行應用開發時,程序員根本不必關心整個消息傳遞,只需要用and_then、spawn等方法建立鏈條并讓系統工作起來就可以了。

poll做的本質工作就是監測鏈條上前續Future的執行狀態

而epoll(多路復用)是基于poll的另一種高并發機制,這種機制可以監視多個描述符,一旦某個描述符狀態變為就緒,能夠通知對應的handler進行后續操作。筆者在前文《這位創造了Github冠軍項目的老男人,堪稱10倍程序員本尊》中曾經介紹過Tdengine的定時器,其中就有這種多路復用的思想。由于操作系統timer的處理程序還不支持epoll的多路復用,因此每注冊一個timer就必須要啟動一個線程進行處理,資源浪費嚴重,因此Tdengine自己實現了一個多路復用的timer,可以做到一個線程同時處理多個timer,這些細節上的精巧設計也是Tdengine封神的原因之一。


Tag:本質 工作 監測 鏈條 前續 執行 狀態
相關文章

發表評論:

性中国熟女毛耸耸性视频,办公室沙发口爆12P,在车上玩弄我的美艳搜子