【问题标题】:What is the purpose of the additional outer async block额外的外部异步块的目的是什么
【发布时间】:2021-08-16 17:15:55
【问题描述】:

在许多 SO 问题以及许多外部知名资源中,例如 tokio tutorial,我看到人们使用额外的 async 块,例如:

tokio::spawn(async move {
    process(socket).await;
});

而不是只做

tokio::spawn(process(socket));

两者都解决了一些 Futurespawn() 预期

pub fn spawn<T>(future: T) ....
where T: Future + ....

所以我无法理解需要额外的 async {} 块。

真的有必要吗?除了作为异步代码的“视觉标记”之外,还有什么区别吗?

【问题讨论】:

  • 这可能是无法回答的,因为它归结为询问这些人为什么这样做。我敢打赌人们会使用async move {},因为它通常可以工作(例如,如果你做不止一件事,或者如果你做的一件事甚至不是异步的),而“内联”它是一个特殊情况一个等待。

标签: rust async-await


【解决方案1】:

这些略有不同,具体取决于process 的实现。

如果process 是这样定义的:

fn process(socket: Socket) -> impl Future {
    // non-async stuff
    println!("non-async stuff");

    // async stuff
    async {
        println!("async stuff");
    }
}

然后用tokio::spawn(process(socket)); 调用它会立即执行第一行,并且只会安排打印"async stuff" 的剩余子任务。

如果它是这样定义的:

async fn process(socket: Socket) {
    // non-async stuff
    println!("non-async stuff");

    // async stuff
    async {
        println!("async stuff");
    }.await;
}

然后tokio::spawn(process(socket)); 将最初什么都不做,并在执行计划任务时打印"non-async stuff""async stuff"

将调用包装在一个额外的 async 块中将使两个版本的行为方式相同。这是否是额外的 async 块的原因,或者在您看到的示例中是否“需要”它是这些示例的作者的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-02-27
    • 2018-07-20
    • 2012-02-06
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多