Ror*_*ory 2 parallel-processing iterator rust rayon
我有一个实现的结构,Iterator它作为迭代器工作正常.它产生值,并使用.map(),我从本地HTTP服务器下载每个项目并保存结果.我现在想要并行化这个操作,Rayon看起来很友好.
尝试按照文档中的示例时,我收到编译器错误.
这是按顺序工作的代码.generate_values返回实现的结构Iterator.dl下载值并保存它们(即它有副作用).由于迭代器在Rust中是懒惰的,所以我.count()最后放了一个它以便它实际运行它.
generate_values(14).map(|x| { dl(x, &path, &upstream_url); }).count();
Run Code Online (Sandbox Code Playgroud)
按照人造丝的例子,我尝试了这个:
generate_values(14).par_iter().map(|x| { dl(x, &path, &upstream_url); }).count();
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
src/main.rs:69:27: 69:37 error: no method named `par_iter` found for type `MyIterator` in the current scope
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我使用.iter(),许多Rust的东西使用时,我得到一个类似的错误:
src/main.rs:69:27: 69:33 error: no method named `iter` found for type `MyIterator` in the current scope
src/main.rs:69 generate_values(14).iter().map(|tile| { dl_tile(tile, &tc_path, &upstream_url); }).count();
Run Code Online (Sandbox Code Playgroud)
自从我实施以来Iterator,我应该.iter()免费获得权利吗?这是为什么.par_iter()不起作用?
Rust 1.6和Rayon 0.3.1
$ rustc --version
rustc 1.6.0 (c30b771ad 2016-01-19)
Run Code Online (Sandbox Code Playgroud)
不,Iterator特征与iter()方法无关。是的,这有点令人困惑。
这里有几个不同的概念。AnIterator是一种可以吐出值的类型;它只需要实现next()并有许多其他方法,但这些都不是iter()。然后是IntoIterator说可以将类型转换为Iterator. 这个特质有into_iter()方法。现在该iter()方法与这两个特征中的任何一个都没有真正相关。它只是许多类型的普通方法,通常与into_iter().
现在到你的 Rayon 问题:看起来你不能把任何普通的迭代器变成一个并行的迭代器。但是,我从未使用过这个库,所以对此持保留态度。在我看来,您需要将迭代器收集到 aVec中才能使用par_iter().
请注意:使用普通迭代器时,不应使用map()and count(),而应使用标准for循环。
人造丝0.3.1定义par_iter为:
pub trait IntoParallelRefIterator<'data> {
type Iter: ParallelIterator<Item=&'data Self::Item>;
type Item: Sync + 'data;
fn par_iter(&'data self) -> Self::Iter;
}
Run Code Online (Sandbox Code Playgroud)
impl<'data, T: Sync + 'data> IntoParallelRefIterator<'data> for [T] {
type Item = T;
type Iter = SliceIter<'data, T>;
fn par_iter(&'data self) -> Self::Iter {
self.into_par_iter()
}
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么卢卡斯Kalbertodt的回答到collect一个Vec将工作; Vec取消引用切片.
通常,Rayon不能假设任何迭代器都适合并行化,因此它不能默认包含所有Iterators.
既然你已经定义了generate_values,你也可以为它实现适当的Rayon特性:
IntoParallelIteratorIntoParallelRefIteratorIntoParallelRefMutIterator这应该可以让你避免收集临时矢量.
| 归档时间: |
|
| 查看次数: |
2041 次 |
| 最近记录: |