在很多 SO 问题以及很多外部的、有信誉的资源中,例如tokio 教程,我看到人们使用了一个额外的async
块,例如:
tokio::spawn(async move {
process(socket).await;
});
Run Code Online (Sandbox Code Playgroud)
而不是只做
tokio::spawn(process(socket));
Run Code Online (Sandbox Code Playgroud)
双方都对某些人有决心Future
并spawn()
期待
pub fn spawn<T>(future: T) ....
where T: Future + ....
Run Code Online (Sandbox Code Playgroud)
所以我无法理解额外async {}
块的需要。
真的有必要吗?除了作为异步代码的“视觉标记”之外,还有什么区别吗?
这些略有不同,具体取决于process
.
如果process
是这样定义的:
fn process(socket: Socket) -> impl Future {
// non-async stuff
println!("non-async stuff");
// async stuff
async {
println!("async stuff");
}
}
Run Code Online (Sandbox Code Playgroud)
然后调用它会立即执行第一行,并且只会安排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;
}
Run Code Online (Sandbox Code Playgroud)
然后最初将不执行任何操作,并在执行计划任务时tokio::spawn(process(socket));
打印 和"non-async stuff"
。"async stuff"
将调用包装在额外的async
块中将使两个版本的行为方式相同。这是否是额外async
块的原因,或者您所看到的示例中是否“需要”它是这些示例的作者的问题。
归档时间: |
|
查看次数: |
99 次 |
最近记录: |