首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rayon::par_iter和for_each在hashmap的每个元素上执行并发异步函数

使用rayon::par_iter和for_each在hashmap的每个元素上执行并发异步函数
EN

Stack Overflow用户
提问于 2021-05-22 12:09:35
回答 1查看 1.1K关注 0票数 1

我能做这样的事吗?

我想在hashmap的每个元素上执行并发异步函数。

代码语言:javascript
复制
async fn b(){
 let hm: HashMap<String,String> = ...;
   
 hm.par_iter().for_each(async move |(k, v)| {
    ...operations on k,v

      another_func(&v).await;
 })
}

异步移动时的错误:

*async move {rustcE0658不匹配类型

预期单元类型()发现不透明类型impl std::future::FuturerustcE0308 mod.rs(61,43):发现的不透明类型*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-22 13:42:49

rayon并不适合异步,因为它运行在普通的非异步函数上,并且在像for_each()这样的操作中阻塞。但是,由于您使用的是异步,所以可以完全避免Rayon,只需为每个操作生成一个任务:

代码语言:javascript
复制
let tasks: Vec<_> = hm
    .iter()
    .map(|(k, v)| {
        let k = k.clone();
        let v = v.clone();
        tokio::spawn(async move {
            some_func(&k, &v);
            another_func(&v).await;
        })
    })
    .collect();
future::join_all(tasks).await;

游乐场

注意,我们克隆了键和值,因为这样可以安全地移动到任务中。没有克隆,借用检查器就不能证明对传递给全局任务的哈希表中的数据的引用不会超过哈希表本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67649293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档