Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

最初に完了したものを選択

Ctrl-C

tokio-badge

ときどき、タスクを実行したい一方で、ユーザーが Ctrl-C を押したらすべてを停止できるようにしておきたいことがあります。 tokio::select! を使うと、まさにそれを実現できます。これは複数の処理を同時に実行し、 最初の 1 つが完了した時点で停止して、他のすべてをキャンセルします。

この例では、プログラムは何らかのデータを取得しようとします。取得が完了する前にユーザーが Ctrl-C を押した場合、 プログラムは待ち続ける代わりにクリーンにシャットダウンします。

両方の分岐は同時に開始されます。先に完了した方が選ばれ、もう一方はキャンセルされます。 fetch_data が先に完了した場合は、その結果が表示され、ループが再び実行されます。 Ctrl-C が先に来た場合は、プログラムは終了します。

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

async fn fetch_data() -> String {
    // 遅いネットワークリクエストをシミュレートする
    sleep(Duration::from_secs(5)).await;
    "data".to_string()
}

#[tokio::main]
async fn main() {
    loop {
        tokio::select! {
            result = fetch_data() => {
                println!("Got: {}", result);
            }
            _ = signal::ctrl_c() => {
                println!("Shutting down...");
                return;
            }
        }
    }
}

macrossignal 機能を有効にして、tokioCargo.toml に追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "signal"] }