昨天介紹了前端工程,yew
,以 Rust 的方式進行前端工作的開發,後編譯成 wasm
的二進制檔案才丟到客戶端由遊覽器直接執行,跳過了JS的動態編譯與執行的過程,提供了近乎原生的網頁邏輯效能,是未來效能需求不斷成長下的值得考量的解決方案。
在介紹 Rust 的後端生態之前,tokio
架構與其生態系是一定要理解的。
Tokio 是一個為 Rust 語言設計的事件驅動、非阻塞 I/O 平台,專為編寫網路應用程式而生 。它提供了一個多執行緒、工作竊取(work-stealing)的排程器,讓應用程式能以極低的開銷處理大量併發請求 。Tokio 的核心價值在於其快速、可靠與易用的特性,它利用 Rust 的記憶體安全模型來避免常見的程式錯誤,並透過 async/await 語法簡化了異步程式的開發複雜度 。
Rust 的異步模型由幾個核心概念組成,而 Tokio 則是驅動這個模型的執行引擎 。
Future
Trait:Future 是一個 trait,代表一個最終會產生值的異步計算。它本質上是一個狀態機,當執行器(Executor)對其進行輪詢(poll)時,它會回傳兩種狀態之一:Poll::Ready(value) 表示計算完成,或 Poll::Pending 表示尚未完成,需要稍後再次輪詢 。
async fn
與 .await
:async fn 是一種語法糖,它會將一個函數轉換為實作 Future 的狀態機。呼叫 async fn 並不會立即執行,而是返回一個 Future 物件。.await 運算子則用於暫停當前 async 函數的執行,直到被等待的 Future 完成為止。在暫停期間,執行緒的控制權會交還給執行時(如 Tokio),使其能夠去執行其他已就緒的任務,從而避免了執行緒阻塞 。
poll
狀態機:執行器會反覆呼叫 Future 的 poll 方法來推進其狀態。如果 poll 回傳 Pending,Future 會負責在未來準備就緒時通知執行器(透過一個名為 Waker 的機制),以便執行器可以再次排程並輪詢它 。這個「輪詢-等待通知-再次輪詢」的循環是整個異步模型的運作核心。
一個典型的 Tokio 任務經歷以下生命週期:
Tokio 不僅僅是一個執行時,它還包含了一整套用於建構生產級應用程式的函式庫,通常被稱為「Tokio 技術堆疊」 。