0

我有一个rayon::ThreadPool我想用它在 Tokio 的运行时上下文之外执行 CPU 绑定任务。CPU 绑定任务是同步任务。

问题是spawn需要关闭,'static但我想使用借来的数据而不是制作拥有的副本。

最初我认为scope会起作用(并且代码也可以编译),但它似乎会阻塞直到关闭完成 - 这将破坏我使用这个池的目的,即不阻塞 tokio 运行时。

如何使用人造丝或任何其他线程池实现来实现这一点?

pub struct TaskPool {
    pool: ThreadPool,
}

impl TaskPool {
    pub fn new(num_threads: usize) -> Self {
        Self {
            pool: ThreadPoolBuilder::new()
                .num_threads(num_threads)
                .build()
                .unwrap(),
        }
    }

    pub async fn verify(&self, hash: &[u8], data: &[u8]) -> bool {
        let (tx, rx) = oneshot::channel();
        self.pool.spawn(|| {
            let ok = hash == calc_sha1(data);
            tx.send(ok).unwrap();
        });
        rx.await.unwrap()
    }
}

操场

4

0 回答 0