首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在现有的迭代器中使用Rayon?

如何在现有的迭代器中使用Rayon?
EN

Stack Overflow用户
提问于 2018-02-22 16:10:23
回答 2查看 3.3K关注 0票数 9

在进行一些过滤之后,我将正则表达式转换为HashSet。我正在尝试将其用于Rayon,但如果不先将其转换为向量,我无法弄清楚如何使Rayon与现有的迭代器一起工作。这个是可能的吗?

代码语言:javascript
复制
let re = Regex::new("url=\"(?P<url>.+?)\"").unwrap();
let urls: HashSet<String> = re.captures_iter(&contents)
    .map(|m| Url::parse(m.name("url").unwrap().as_str()))
    .filter(|parsed_url| parsed_url.is_ok())
    .map(|parsed_url| parsed_url.unwrap())
    .filter(|parsed_url| parsed_url.has_host())
    .map(|parsed_url| parsed_url.into_string())
    .collect();
EN

回答 2

Stack Overflow用户

发布于 2019-01-15 22:50:05

现在,使用ParallelBridge可以做到这一点

代码语言:javascript
复制
use rayon::iter::ParallelBridge;
use rayon::prelude::ParallelIterator;
use std::sync::mpsc::channel;

let rx = {
    let (tx, rx) = channel();

    tx.send("one!");
    tx.send("two!");
    tx.send("three!");

    rx
};

let mut output: Vec<&'static str> = rx.into_iter().par_bridge().collect();
output.sort_unstable();

assert_eq!(&*output, &["one!", "three!", "two!"]);
票数 11
EN

Stack Overflow用户

发布于 2018-02-22 20:24:28

对于上一版本的人造丝来说,这个答案已经过时了。有关可能的解决方案,请参阅other answer。它可能适用于也可能不适用于您的用例。

最小重现:

代码语言:javascript
复制
extern crate rayon;

use rayon::prelude::*;

fn main() {
    let v = vec![1_i32, 2, 3, 4].into_iter();

    // no method named `par_iter` found for type `std::vec::IntoIter<i32>`
    let _ = v.par_iter().sum();
}

你不能这么做。Here是此功能的所有实现者,即:

  • BinaryHeap
  • BTreeMap
  • BTreeSet
  • HashMap
  • HashSet
  • LinkedList
  • VecDeque
  • Option
  • Range
  • Result
  • Slice/Array

我认为你不能并行化它们的原因是因为迭代器是懒惰的。迭代器基本上是当前项的Option<Item>next()方法。您不能将其拆分为两个部分,以便在不同的线程中执行它们。

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

https://stackoverflow.com/questions/48922420

复制
相关文章

相似问题

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