tec*_*ara 3 rust async-await rust-tokio
在这个 Tokio 教程中,它有代码:
tokio::spawn(async move {
process(socket).await;
});
Run Code Online (Sandbox Code Playgroud)
我不明白为什么async move {}这里使用块。据我所知,到目前为止这是没有必要的。下面的方法就可以了,而且更加简洁和直接:
tokio::spawn(process(socket));
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是
async需要该块?async添加额外的间接层,可能会导致性能略有下降?
- 此代码中是否需要异步块?
大多数时候,不会;但请参阅下一个答案。
- 如果是这样,那有什么区别呢?
如果 caseprocess()定义为async fn,则什么也没有。有些人喜欢一种形式,但这是主观的。
但是,如果process()将 定义为返回 a 的常规函数Future,则存在差异:使用async块时,所有of 都process()在新生成的任务中执行,而没有它时,对的调用process()将在父任务中执行,并且仅在 future 中执行它返回在生成的任务中执行。
这可能很重要,例如,如果process()返回的 future 不是'static(或Send),在这种情况下,没有块的调用async将失败。或者,如果process()它本身可能很昂贵,并且我们希望它在另一个任务中执行,而不仅仅是它返回的未来。
请注意,调用 时也有类似的区别Runtime::block_on(),但区别更重要:没有async块, 中 的代码在异步运行时之外process()执行。这意味着对需要活动运行时(例如)的函数的调用将失败。tokio::spawn()
- 如果没有编译器优化,异步块是否会添加额外的间接层,可能会导致性能略有下降?
我不知道生成器(以及在生成器之上实现的异步函数和块)的确切实现细节,但这不太可能。Rust 中的异步块不会分配,而且我认为使用async仅转发的块不会产生任何开销。