gpt4 book ai didi

rust - 额外的外部异步 block 的目的是什么

转载 作者:行者123 更新时间:2023-12-04 11:56:32 24 4
gpt4 key购买 nike

在许多 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 {}堵塞。
真的有必要吗?除了作为异步代码的“视觉标记”之外,还有什么区别吗?

最佳答案

这些略有不同,取决于 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阻止或者在您看到的示例中是否“需要”它是这些示例的作者的问题。

关于rust - 额外的外部异步 block 的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68806814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com