教程
Tokio 是 Rust 编程语言的异步运行时。它为编写网络应用程序提供了所需的构建块。它提供了灵活性,可以针对各种系统,从具有数十个核心的大型服务器到小型嵌入式设备。
在高层次上,Tokio 提供了几个主要组件
- 用于执行异步代码的多线程运行时。
- 标准库的异步版本。
- 庞大的库生态系统。
Tokio 在项目中的作用
当您以异步方式编写应用程序时,您可以通过降低同时执行多项任务的成本来使其更好地扩展。但是,异步 Rust 代码不会自行运行,因此您必须选择一个运行时来执行它。Tokio 库是使用最广泛的运行时,其使用量超过所有其他运行时的总和。
此外,Tokio 提供了许多有用的实用程序。在编写异步代码时,您不能使用 Rust 标准库提供的普通阻塞 API,而必须使用它们的异步版本。这些替代版本由 Tokio 提供,在有意义的地方镜像了 Rust 标准库的 API。
Tokio 的优势
本节将概述 Tokio 的一些优势。
快速
Tokio 非常快速,它构建在 Rust 编程语言之上,而 Rust 本身也很快。这秉承了 Rust 的精神,目标是您不应该能够通过手动编写等效代码来提高性能。
Tokio 是可扩展的,它构建在 async/await 语言特性之上,而 async/await 本身也是可扩展的。在处理网络时,由于延迟,您可以处理连接的速度是有限制的,因此扩展的唯一方法是同时处理多个连接。借助 async/await 语言特性,增加并发操作的数量变得非常廉价,使您可以扩展到大量并发任务。
可靠
Tokio 使用 Rust 构建,Rust 是一种使每个人都能构建可靠且高效软件的语言。 多项研究表明,大约 70% 的高危安全漏洞是内存不安全造成的。使用 Rust 可以消除应用程序中的整个此类错误。
Tokio 还非常注重提供一致的行为,没有意外。Tokio 的主要目标是让用户部署可预测的软件,该软件日复一日地以可靠的响应时间和无不可预测的延迟峰值运行。
简单易用
借助 Rust 的 async/await 特性,编写异步应用程序的复杂性已大大降低。与 Tokio 的实用程序和充满活力的生态系统相结合,编写应用程序变得轻而易举。
Tokio 在有意义的时候遵循标准库的命名约定。这使得可以轻松地将仅使用标准库编写的代码转换为使用 Tokio 编写的代码。凭借 Rust 强大的类型系统,轻松交付正确代码的能力是无与伦比的。
灵活
Tokio 提供了运行时的多种变体。从多线程、工作窃取运行时到轻量级、单线程运行时,应有尽有。这些运行时中的每一个都带有许多旋钮,允许用户根据自己的需求进行调整。
何时不应使用 Tokio
虽然 Tokio 对于许多需要同时执行大量任务的项目很有用,但在某些用例中,Tokio 并不适用。
- 通过在多个线程上并行运行 CPU 密集型计算来加速它们。Tokio 专为 IO 密集型应用程序而设计,在这些应用程序中,每个单独的任务大部分时间都花费在等待 IO 上。如果您的应用程序唯一做的事情是并行运行计算,则应使用 rayon。也就是说,如果您需要同时执行这两项操作,仍然可以“混合搭配”。有关实际示例,请参见这篇博客文章。
- 读取大量文件。虽然看起来 Tokio 对于只需要读取大量文件的项目很有用,但与普通线程池相比,Tokio 在这里没有优势。这是因为操作系统通常不提供异步文件 API。
- 发送单个 Web 请求。Tokio 为您带来优势的地方在于您需要同时执行许多操作时。如果您需要使用专为异步 Rust 设计的库(例如 reqwest),但您不需要一次执行很多操作,则应首选该库的阻塞版本,因为它会使您的项目更简单。当然,使用 Tokio 仍然可以工作,但与阻塞 API 相比,它没有真正的优势。如果该库不提供阻塞 API,请参阅关于与同步代码桥接的章节。
获取帮助
在任何时候,如果您遇到困难,您都可以随时在 Discord 或 GitHub 讨论中获得帮助。不要担心提出“初学者”问题。我们都从某个地方开始,并且很乐意提供帮助。