首页 > 解决方案 > 为什么 async-std 的 task::spawn 会阻止后续代码行执行?

问题描述

我正在尝试使用异步标准task::spawn

use std::time::Duration;

async fn w() {
    loop {
        task::sleep(Duration::from_secs(1)).await;
        println!("Tick");
    }
}

#[async_std::main]
async fn main() {
    println!("Start");
    task::spawn(w()).await;
    println!("End");
}

我希望在“开始”之后立即打印“结束”,但“滴答”循环会无休止地打印。

那么与下面的具体有什么区别呢?

#[async_std::main]
async fn main() {
    println!("Start");
    w().await;
    println!("End");
}

标签: asynchronousrustasync-await

解决方案


不要.await生成任务。这样做就像加入一个线程:它在继续之前等待任务完成。spawn无需等待句柄返回即可驱动任务完成。

task::spawn(w()).await;

如所写,您是正确的,task::spawn(w()).awaitw().await. 他们都阻塞了等待w()完成的线程。

那么等待生成呼叫的目的是什么?如果你想生成一个后台任务,在当前线程上做一些其他的工作,然后阻塞,这很有用。

let handle = task::spawn(w());

do_other_things_for_a_while();

// Block and retrieve the result.
let result = handle.await;

推荐阅读