我能做这样的事吗?
我想在hashmap的每个元素上执行并发异步函数。
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):发现的不透明类型*
发布于 2021-05-22 13:42:49
rayon并不适合异步,因为它运行在普通的非异步函数上,并且在像for_each()这样的操作中阻塞。但是,由于您使用的是异步,所以可以完全避免Rayon,只需为每个操作生成一个任务:
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;注意,我们克隆了键和值,因为这样可以安全地移动到任务中。没有克隆,借用检查器就不能证明对传递给全局任务的哈希表中的数据的引用不会超过哈希表本身。
https://stackoverflow.com/questions/67649293
复制相似问题