本文介绍了如何在 Tokio 中为 CPU 密集型工作创建专用线程池?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基于 Tokio 运行时的 Rust 异步服务器.它必须同时处理对延迟敏感的 I/O 密集型请求和大量 CPU 密集型请求.

I have a Rust async server based on the Tokio runtime. It has to process a mix of latency-sensitive I/O-bound requests, and heavy CPU-bound requests.

我不想让 CPU 密集型任务垄断 Tokio 运行时并使 I/O 密集型任务挨饿,所以我想将 CPU 密集型任务卸载到专用的、隔离的线程池(隔离是关键在这里,所以一个共享线程池上的 spawn_blocking/block_in_place 是不够的).如何在 Tokio 中创建这样的线程池?

I don't want to let the CPU-bound tasks monopolize the Tokio runtime and starve the I/O bound tasks, so I'd like to offload the CPU-bound tasks to a dedicated, isolated threadpool (isolation is the key here, so spawn_blocking/block_in_place on one shared threadpool are insufficient). How can I create such a threadpool in Tokio?

启动两个运行时的幼稚方法遇到错误:

A naive approach of starting two runtimes runs into an error:

线程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 池?

Can Tokio allow two separate runtimes? Is there a better way to create an isolated CPU pool in Tokio?

推荐答案

虽然 Tokio 已经有一个线程池,Tokio 的文档建议:

While Tokio already has a threadpool, the documentation of Tokio advises:

如果您的代码受 CPU 限制,并且您希望限制用于运行它的线程数,则应在另一个线程池上运行它,例如 人造丝.您可以使用 oneshot 通道将结果发回rayon 任务完成后发送给 Tokio.

所以,如果你想创建一个线程池来大量使用 CPU,一个好方法是使用像 Rayon 这样的 crate 并将结果发送回 Tokio 任务.

So, if you want to create a threadpool to make heavy use of CPU, a good way is to use a crate like Rayon and send the result back to the Tokio task.

这篇关于如何在 Tokio 中为 CPU 密集型工作创建专用线程池?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 07:07
查看更多