【发布时间】:2020-08-28 08:42:57
【问题描述】:
我有一个基于 Tokio 运行时的 Rust 异步服务器。它必须同时处理对延迟敏感的 I/O 绑定请求和繁重的 CPU 绑定请求。
我不想让 CPU 密集型任务独占 Tokio 运行时并饿死 I/O 密集型任务,因此我想将 CPU 密集型任务卸载到一个专用的隔离线程池(隔离是关键在这里,所以一个共享线程池上的spawn_blocking/block_in_place 是不够的)。如何在 Tokio 中创建这样的线程池?
启动两个运行时的幼稚方法会遇到错误:
线程“tokio-runtime-worker”在“无法从运行时内启动运行时”出现恐慌。发生这种情况是因为一个函数(如
block_on)在线程被用于驱动异步任务时试图阻塞当前线程。'
use tokio; // 0.2.20
fn main() {
let mut main_runtime = tokio::runtime::Runtime::new().unwrap();
let cpu_pool = tokio::runtime::Builder::new().threaded_scheduler().build().unwrap();
let cpu_pool = cpu_pool.handle().clone(); // this is the fix/workaround!
main_runtime.block_on(main_runtime.spawn(async move {
cpu_pool.spawn(async {}).await
}))
.unwrap().unwrap();
}
Tokio 可以允许两个独立的运行时吗?有没有更好的方法在 Tokio 中创建一个隔离的 CPU 池?
【问题讨论】:
-
我知道
block_in_place,但它不能提供我正在寻找的隔离保证。 -
我正在寻找的隔离保证,这是什么保证?请edit您的问题说明所有您的要求。
-
@Shepmaster 我认为它已经存在:“我不想让 CPU 密集型任务独占 Tokio 运行时并饿死 I/O 密集型任务。”
标签: rust threadpool rust-tokio