メイン関数を非同期にできない場合に Rust で async/await を使用する方法 質問する

メイン関数を非同期にできない場合に Rust で async/await を使用する方法 質問する

非同期でファイルをダウンロードする関数があります:

async fn download_file() {
    fn main() {
        let resp = reqwest::blocking::get("https://sh.rustup.rs").expect("request failed");
        let body = resp.text().expect("body invalid");
        let mut out = File::create("rustup-init.sh").expect("failed to create file");
        io::copy(&mut body.as_bytes(), &mut out).expect("failed to copy content");
    }
}

この関数を呼び出してファイルをダウンロードし、必要なときに待機したいと思います。
しかし、問題は、次のようにするとエラーが発生することです。

fn main() {
    let download = download_file();
    // Do some work
    download.await; // `await` is only allowed inside `async` functions and blocks\nonly allowed inside `async` functions and blocks
    // Do some work
}

したがって、メイン関数を非同期にする必要がありますが、そうすると別のエラーが発生します。

async fn main() { // `main` function is not allowed to be `async`\n`main` function is not allowed to be `async`"
    let download = download_file();
    // Do some work
    download.await;
    // Do some work
}

では、asyncとawaitをどのように使用すればよいのでしょうか。
ご協力ありがとうございます

ベストアンサー1

最もよく使用されるランタイムである tokio は、メイン関数を非同期にするための属性マクロを提供します。

#[tokio::main]
async fn main() {
    let download = download_file().await;
}

まだ tokio に依存していない場合は、以下を に追加しますCargo.toml

tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

おすすめ記事