瞭解 Tokio 的高級概念

Tokio 是 Rust 中異步編程的運行時,圍繞 Future 的抽象而構建。它利用了 Rust 的所有權和併發模型的強大功能來併發處理多個任務。它提供了一系列用於編寫異步代碼的實用程序,包括 I/O 驅動程序、計時器和異步任務調度器。

瞭解 Tokio 的高級概念可以進一步幫助我們創建更復雜和高效的應用程序。

首先在我們項目中的 Cargo.toml 文件中加入依賴庫:

[dependencies]
tokio = { version = "1.28.2"features = ["full"] }
tokio-stream = "0.1.14"

Streams(流)

Tokio 中的 streams 是異步值的序列,它們類似於迭代器,但不是阻塞執行。streams 可以表示事件序列或異步 I/O。例如,streams 可以表示從 WebSocket 連接傳入的消息。

下面是一個簡單的 streams 例子:

use tokio_stream::{once, StreamExt};

#[tokio::main]
async fn main() {
    let mut stream = once(5);

    while let Some(v) = stream.next().await {
        println!("{}", v);
    }
}

這個例子創建了一個只包含一個元素 5 的 streams,然後將其打印出來。

Channels(通道)

Tokio 中的 channel 用於異步任務之間的通信,可以使用它們將數據從一個任務發送到另一個任務。channel 可以是有界的,也可以是無界的,有界 channel 對一次可以容納多少消息有限制,而無界 channel 則沒有這樣的限制。

下面是一個簡單的 channel 例子:

use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::channel(100);

    tokio::spawn(async move {
        for i in 0..10 {
            if tx.send(i).await.is_err() {
                break;
            }
        }
    });

    while let Some(v) = rx.recv().await {
        println!("{}", v);
    }
}

這個例子創建了一個容量爲 100 的 channel,然後,它啓動一個新任務,將數字從 0 到 9 發送到 channel 中。同時,主任務從 channel 接收數字並打印出來。

Timeouts(超時)

Tokio 提供了設置任務超時的實用程序,可以使用超時來防止任務花費太長時間。如果一個任務在超時前沒有完成,它將被取消。

下面是一個超時的例子:

use tokio::time::{sleep, timeout, Duration};

#[tokio::main]
async fn main() {
    let result = timeout(Duration::from_secs(5), sleep(Duration::from_secs(10))).await;

    match result {
        Ok(_) => println!("Task finished in time"),
        Err(_) => println!("Task timed out"),
    }
}

這個例子創建了一個休眠 10 秒的任務,併爲它設置了 5 秒的超時。因此,任務將在完成之前被取消,並且程序將打印 “task timed out”。

錯誤處理

Tokio 中的錯誤處理方式與同步 Rust 中的相同,也使用 Result 和 Option 類型處理可能失敗的函數。當使用? 操作符時,如果表達式爲 Err,則函數將立即返回並將控制權交還給執行器。

下面是一個錯誤處理的例子:

use tokio::fs::File;
use tokio::io::AsyncReadExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut file = File::open("foo.txt").await?;
    let mut contents = String::new();
    file.read_to_string(&mut contents).await?;
    println!("{}", contents);
    Ok(())
}

這個例子試圖打開一個名爲 “foo.txt” 的文件並讀取其內容,如果文件無法打開或內容無法讀取,該函數將返回一個錯誤。

簡而言之,Tokio 是 Rust 中異步編程的強大工具。它爲構建高效的併發應用程序提供了一個健壯的框架,並提供了各種有用的實用程序來處理流、通道、超時和錯誤。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vmIN-Iucq3oLgr5HlNL2hw