额外的外部异步块的目的是什么

Sve*_*rev 6 rust async-await

在很多 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)

双方都对某些人有决心Futurespawn()期待

pub fn spawn<T>(future: T) ....
where T: Future + ....
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*all 2

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