我有一个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()
}
}