環境
- Time 2022-01-13
- Rust 1.57.0
- Tokio 1.15.0
概念
參考:https://tokio.rs/tokio/tutorial
Tokio 是 Rust 編程語言的異步運行時。它提供了編寫網絡應用程序所需的構建基礎。它提供了針對各種系統的靈活性,從具有數十個內核的大型服務器到小型嵌入式設備。
在高層次上,Tokio提供了幾個主要組件:
- 用於執行異步代碼的多線程運行時。
- 標准庫的異步版本。
- 龐大的異步庫生態系統。
Tokio 在項目中的角色
當你以異步方式編寫應用程序時,可以通過降低同時執行許多操作的成本來使其更好地擴展。但是,異步 Rust 代碼不會自行運行,因此您必須選擇運行時來執行它。Tokio 庫是使用最廣泛的運行時,在使用上超過了所有其他運行時的總和。
此外,Tokio 還提供了許多有用的實用程序。編寫異步代碼時,不能使用 Rust 標准庫提供的普通阻塞 API,而必須改用它們的異步版本。這些替代版本由 Tokio 提供,在能使用的地方,鏡像了 Rust 標准庫的 API。
Tokio 的優勢
本節將概述 Tokio 的一些優點。
快
Tokio 是快速的,建立在 Rust 編程語言之上,Rust 編程語言本身也很快。這是本着 Rust 的精神完成的,其目標是你不應該通過手動編寫等效代碼來提高性能。
Tokio 是可擴展的,建立在 async/await
語言功能之上,該功能本身是可擴展的。處理網絡時,由於延遲,處理連接的速度有限,因此擴展的唯一方法是一次處理多個連接。使用在 async/await
語言功能,增加並發操作的數量變得非常便宜,允許您擴展大量並發任務。
可靠
Tokio 是使用 Rust 構建的,Rust 是一種語言,使每個人都能夠構建可靠而高效的軟件。研究發現,大約 70% 的高嚴重性安全漏洞是內存不安全的結果。使用 Rust 可以消除應用程序中的這一類錯誤。
Tokio 還非常注重提供一致的行為,不會出現意外。Tokio 的主要目標是允許用戶部署可預測的軟件,這些軟件將以可靠的響應時間執行,並且沒有不可預測的延遲峰值。
容易
借助 Rust 的 async/await
功能,編寫異步應用程序的復雜性已大大降低。與 Tokio 的實用程序和充滿活力的生態系統相結合,編寫應用程序輕而易舉。
Tokio 在有意義時遵循標准庫的命名約定。這允許輕松地將僅使用標准庫編寫的代碼轉換為使用Tokio編寫的代碼。借助 Rust 的強大類型系統,輕松交付正確代碼的能力無與倫比。
靈活
Tokio 提供了運行時的多種變體。從多線程、任務竊取運行時到輕量級單線程運行時,應有盡有。這些運行時中的每一個都帶有許多配置,以允許用戶根據自己的需要調整它們。
什么時候不使用 Tokio
盡管 Tokio 對於許多需要同時做很多事情的項目很有用,但也有一些場景,Tokio 並不適合。
- 通過在多個線程上並行運行 CPU 密集型計算來加快這些計算的速度。Tokio 是為 IO 綁定的應用程序而設計的,其中每個單獨的任務將大部分時間花在等待 IO 上。如果您的應用程序唯一要做的就是並行運行計算,則應使用 rayon。也就是說,如果你需要同時做這兩件事,仍然可以"混合和匹配"。
- 讀取大量文件。雖然 Tokio 對於只需要讀取大量文件的項目似乎很有用,但與普通的線程池相比,Tokio 在這里沒有任何優勢。這是因為操作系統通常不提供異步文件 API。
- 發送單個 Web 請求。Tokio 給你帶來優勢的地方是當你需要同時做很多事情的時候。如果你需要使用一個用於異步 Rust 的庫,比如 reqwest,但你不需要一次做很多事情,你應該更喜歡該庫的阻塞版本,因為它會讓你的項目更簡單。當然,使用 Tokio 仍然可以工作,但與阻塞 API 相比,它並沒有提供真正的優勢。
總結
描述了 Tokio
的優勢和劣勢,根據具體的場景進行選擇。