异步 Rust

在 Rust 中,异步编程依赖于 future 的概念,以表示可能长时间运行且可能不会立即完成的操作。这些 future 需要一种机制来驱动其执行和完成。这时,异步执行程序就派上用场了。

异步执行器负责管理和运行这些 future。它提供了一个环境,可以在其中调度 future、轮询 future 的进度,并最终推动 future 完成。您可以将其视为一个编排器,用于处理异步任务的复杂性,使您的代码保持响应性和高效性。

Rust 提供了各种异步执行器,每种执行器都有自己的优势和特点。

异步执行器

Rust 服务执行器的选择很大程度上取决于其工作负载的性质。虽然 Tokio 是一款强大的异步运行时,但可能并非所有场景的最佳解决方案。

对于主要执行顺序操作的服务,引入像 Tokio 这样的异步运行时可能会带来不必要的开销,而不会带来显著的性能提升。在这种情况下,单线程执行器可能更适合,也更轻量。这种方法可以简化代码库并减少资源消耗。

配置工作器线程

在处理具有固有的并发或异步操作的服务时,利用 Tokio 等异步运行时的功能至关重要。为了在这些场景中最大限度地提高性能,请配置运行时以使用与系统上可用的 CPU 核心数相匹配的工作器线程数。这样一来,运行时便可以高效地分配工作负载,并充分利用可用的处理能力。

配置工作线程时,请考虑整个系统环境。如果多个服务在同一虚拟机上积极运行,请调整每个服务的工作线程数,以防止 CPU 过度利用,并确保在所有活跃进程之间公平分配资源。

阻塞操作

务必要确保异步运行时中的工作器线程永远不会被长时间运行的操作或同步操作阻塞。阻塞工作线程会严重阻碍运行时处理传入任务和保持响应能力。

如果在工作器线程上执行的函数需要执行阻塞操作,请使用 tokio::spawn_blocking。此函数会将阻塞操作分流到专门为此类任务设计的单独线程池,从而防止异步工作线程受到任何中断,并确保服务的整体响应能力。