导读 本文将带您探索 Tokio Runtime 的核心组件,同时会介绍其在 ArcGraph 项目中的应用。阅读本文后,您将会对 Tokio Runtime 的基本原理有一个清晰的了解。此外,您也会对如何在项目中用好 Tokio 有很好的认知。
01 Tokio 概述
Rust 是一门新兴的系统编程语言,它的独特之处在于成功地解决了传统系统编程语言中常见的内存安全问题。与很多主流语言不一样的是,Rust 虽然在语言层面上提供了对异步编程的支持,但是它并没有内置异步 Runtime,因为它认为把 Runtime 这种核心的东西交给社区,可以使得自己的标准库更加轻量,同时也可以保证开发者在 Runtime 选择上的灵活性。基于 Rust 没有内置 Runtime 的现实和大家对于异步编程的强烈需求,两个优秀的程序员 Carl Lerche 和 Sean McArthur,开始探索如何在 Rust 中构建一个现代的异步框架,以支持高性能、高并发的异步程序。他们的努力最终形成了 Tokio。
源于社区的力量与 Rust 语言在各领域的快速发展,当前 Tokio 已经成为了 Rust 异步编程领域的首选框架。目前围绕 Tokio 已经形成了一个完整的生态,除了核心的 Tokio Runtime,还有许多与 Tokio 集成的扩展、工具等,可以相互配合来更好地满足开发者不同的异步编程需求、帮助他们写出更健壮的异步代码。Tokio 的社区非常活跃,Tokio 的核心开发团队也在不断努力优化框架的性能,以确保它在高并发、高吞吐量等方面保持卓越表现;社区的其他成员为 Tokio 提供了大量的使用文档和示例,这些都让 Tokio 变得越来越流行。目前,Tokio 的整个生态如下图所示:
从上图可以看到,Tokio Runtime 在整个 Tokio 生态中起着重要的作用。本文将带您探索 Tokio Runtime 的核心组件,同时会介绍其在 ArcGraph 项目中的应用。阅读本文后,您将会对 Tokio Runtime 的基本原理有一个清晰的了解。此外,您也会对如何在项目中用好 Tokio 有很好的认知。
02 Rust 语言对异步的支持
在介绍 Tokio Runtime 的核心组件之前,我们先来看一下 Rust 在语言层面上对异步编程提供的支持。Rust 异步编程依赖于两个关键概念:Future
和async/await
。
什么是 Future 呢?Future 是一个个的结构体,它们封装了异步运算的逻辑,Rust 规定所有的 Future 都必须实现 Future Trait,从而第三方的 Runtime 或者其他框架能够面向 Trait 对 Future 做一致性的处理。Future Trait 长这样:
pub trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}
我们以一个 Runtime 中的调用链路为例,来加深一下对 Future 的理解:
从图中我们可以看到,Future 是 Task