一个常见的说法是,线程能做所有 async/await 能做的事,而且更简单。那么,为什么会有人选择 async/await?

这是我在 Rust 社区经常遇到的问题。坦率地说,我完全理解这个问题的来龙去脉。

Rust 是一种低级语言,它不会向你隐藏 coroutines 的复杂性。这与 Go 等语言截然相反,在 Go 语言中,async 是默认发生的,程序员甚至不需要考虑它。

聪明的程序员会尽量避免复杂性。因此,他们会看到 async/await 的额外复杂性,并质疑为什么需要它。考虑到操作系统线程中存在合理的替代方案,这个问题就显得尤为重要。

让我们对 async 进行一次思维之旅,看看它的优势在哪里。

背景突击

Rust 是一种低级语言。通常,代码是线性的;一件事接着一件事运行。它看起来是这样的

fn main() { foo(); bar(); baz();

}

简单漂亮,对吧?

不过,有时您会希望同时运行多个程序。最典型的例子就是网络服务器。请看下面用线性代码编写的内容: