gpt4 book ai didi

rust - 如何在 Tokio 中为 CPU 密集型工作创建专用线程池?

转载 作者:行者123 更新时间:2023-12-03 11:25:19 24 4
gpt4 key购买 nike

我有一个基于 Tokio 的 Rust 异步服务器运行。它必须同时处理对延迟敏感的 I/O 绑定(bind)请求和繁重的 CPU 绑定(bind)请求。

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

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

thread 'tokio-runtime-worker' panicked at 'Cannot start a runtime from within a runtime. This happens because a function (like block_on) attempted to block the current thread while the thread is being used to drive asynchronous tasks.'



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

最佳答案

虽然 Tokio 已经有一个线程池,但 documentation of Tokio advises :

If your code is CPU-bound and you wish to limit the number of threads used to run it, you should run it on another thread pool such as rayon. You can use an oneshot channel to send the result back to Tokio when the rayon task finishes.



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

关于rust - 如何在 Tokio 中为 CPU 密集型工作创建专用线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61752896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com