微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

专用人造丝池提交工作并异步等待完成

如何解决专用人造丝池提交工作并异步等待完成

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

playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。