非同步 Rust

在 Rust 中,非同步程式設計依賴「Future」的概念,代表可能長時間執行的作業,這些作業可能不會立即完成。這些 Future 需要機制來驅動執行和完成作業。這時非同步執行器就會派上用場。

非同步執行器負責管理及執行這些 Future。這個環境可排定期貨、輪詢進度,並最終推動期貨完成。這項工具可視為自動調度管理工具,負責處理非同步工作的複雜性,讓程式碼保持回應能力和效率。

Rust 提供各種非同步執行器,各有優點和特性。

非同步執行器

Rust 服務的執行器選擇取決於工作負載的性質。雖然 Tokio 是功能強大的非同步執行階段,但可能不是所有情境的最佳解決方案。

對於主要執行循序作業的服務,導入 Tokio 等非同步執行階段可能會造成不必要的負擔,而無法顯著提升效能。在這種情況下,單一執行緒執行器可能更適合,而且更輕量。這種做法可簡化程式碼集,並減少資源消耗量。

設定工作執行緒

處理本質上具有並行或非同步作業的服務時,利用 Tokio 等非同步執行階段的功能至關重要。如要盡量提升這些情境的效能,請將執行階段設定為使用與系統可用 CPU 核心數量相符的工作站執行緒數量。這樣一來,執行階段就能有效分配工作負載,充分運用可用的處理能力。

設定工作者執行緒時,請考量整體系統環境。如果多項服務在同一部虛擬機器上積極運作,請調整每項服務的工作站執行緒數量,避免 CPU 過度使用,並確保所有作用中程序都能公平分配資源。

封鎖作業

請務必確保非同步執行階段中的背景工作執行緒,絕不會因長時間執行或同步作業而遭到封鎖。封鎖背景工作執行緒會嚴重影響執行階段處理傳入工作和維持回應能力。

如果要在背景工作執行緒上執行的函式需要執行封鎖作業,請使用 tokio::spawn_blocking。這個函式會將封鎖作業卸載至專為這類任務設計的獨立執行緒集區,避免非同步背景工作執行緒中斷,並確保服務的整體回應速度。