Tokio 1.0 穩定版本已釋出,Tokio 是 Rust 的非同步 runtime,可用於編寫快速、可靠的網路應用。Tokio 還提供用於 TCP、UDP、計時器、多執行緒、工作竊取演算法(work-stealing)排程等的 API。
Tokio 團隊表示,雖然 Tokio 從四年前剛誕生起就一直在不斷髮展,不過出現真正的顯著變化是在一年前,因為 Rust 在當時才正式支援 async/await。
示例程式碼
使用 Tokio 編寫的基本 TCP echo 伺服器:
use tokio::net::TcpListener;use tokio::io::{AsyncReadExt, AsyncWriteExt};#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let mut listener = TcpListener::bind("127.0.0.1:8080").await?; loop { let (mut socket, _) = listener.accept().await?; tokio::spawn(async move { let mut buf = [0; 1024]; // In a loop, read data from the socket and write the data back. loop { let n = match socket.read(&mut buf).await { // socket closed Ok(n) if n == 0 => return, Ok(n) => n, Err(e) => { eprintln!("failed to read from socket; err = {:?}", e); return; } }; // Write the data back if let Err(e) = socket.write_all(&buf[0..n]).await { eprintln!("failed to write to socket; err = {:?}", e); return; } } }); }}
在釋出公告中,Tokio 團隊還介紹了 Tokio 的知名使用者和案例。例如,Discord 透過使用 Tokio 將長尾延遲 (Tail Latency) 降低了 5 倍;Fly.io 使用 Tokio 後輕易滿足了效能要求;AWS 的 Lambda 團隊也使用 Tokio 實現了更可靠、更靈活的服務。
1.0 作為重要版本更新,Tokio 團隊對其穩定性做出了保證,承諾會為 Rust 生態提供穩定的基礎設施。Tokio 團隊表示目前沒有關於 Tokio 2.0 的計劃,並承諾至少在 3 年內不釋出 Tokio 2.0。他們計劃為 1.0 提供至少 5 年的維護支援。
當然,穩定並不意味著 Tokio 停滯不前,Tokio 團隊介紹了他們未來要完成的工作:推動 Stream trait 進入 Rust 標準庫、實現 io_uring 介面、整合 tracing 以及完善 Tokio 的整體生態。這裡的生態就是 Tokio 團隊所說的 Tokio stack。舉個例子,Tokio 為標準基元 (standard primitives),如 socket 和定時器提供了 runtime 和非同步API,但網路應用通常會使用更高級別的協議,如 HTTP 和 gRPC。因此 Tokio stack 會提供 HTTP 的 Hyper 和 gRPC 的 Tonic 以滿足需求。
最後,Tokio 團隊表示隨著 Tokio 的推出,他們會專注於開發 Tower,這是一套用於構建可靠客戶端和伺服器的可重用元件。
詳情檢視 https://tokio.rs/blog/2020-12-tokio-1-0