一个常见的说法是,线程能做所有 async/await 能做的事,而且更简单。那么,为什么会有人选择 async/await?
这是我在 Rust 社区经常遇到的问题。坦率地说,我完全理解这个问题的来龙去脉。
Rust 是一种低级语言,它不会向你隐藏 coroutines 的复杂性。这与 Go 等语言截然相反,在 Go 语言中,async 是默认发生的,程序员甚至不需要考虑它。
聪明的程序员会尽量避免复杂性。因此,他们会看到 async/await 的额外复杂性,并质疑为什么需要它。考虑到操作系统线程中存在合理的替代方案,这个问题就显得尤为重要。
让我们对 async 进行一次思维之旅,看看它的优势在哪里。
背景突击
Rust 是一种低级语言。通常,代码是线性的;一件事接着一件事运行。它看起来是这样的
fn main() { foo(); bar(); baz();
}
简单漂亮,对吧?
不过,有时您会希望同时运行多个程序。最典型的例子就是网络服务器。请看下面用线性代码编写的内容: