在进行一些过滤后,我将正则表达式转换为HashSet
。我试图将它与Rayon一起使用,但是我无法弄清楚如何使Rayon与现有的迭代器一起工作而不首先将其转换为矢量。这可能吗?
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();
答案 0 :(得分:7)
对于最新版本的人造丝来说,这个答案已经过时了。有关可能的解决方案,请参阅other answer。它可能适用于您的用例,也可能不适用。
最小复制:
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是此功能的所有实现者,即:
我认为你无法并行化它们的原因是因为迭代器是懒惰的。迭代器基本上是当前项Option<Item>
和next()
方法。你不能将它分成两部分来在不同的线程中执行它们。
答案 1 :(得分:3)
现在可以使用ParallelBridge
:
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!"]);