6 个版本
0.3.0 | 2022年9月18日 |
---|---|
0.2.3 | 2022年9月17日 |
0.0.1 | 2022年9月15日 |
#1871 在 Rust 模式
在 bupstash 中使用
13KB
284 行
plmap
为 Rust 实现的并行管道映射迭代器。
文档
示例
并行管道映射
// Import the iterator extension trait.
use plmap::PipelineMap;
// Map over an iterator in parallel with 5 worker threads.
fn example() {
for i in (0..100).plmap(5, |x| x * 2) {
println!("i={}", i);
}
}
使用自己的类型而不是函数进行映射
use plmap::{Mapper, PipelineMap};
// The type must support clone as each worker thread gets a copy.
#[derive(Clone)]
struct CustomMapper {}
impl Mapper<i32> for CustomMapper {
type Out = i64;
fn apply(&mut self, x: i32) -> i64 {
(x * 2) as i64
}
}
fn custom_mapper() {
for i in (0..100).plmap(5, CustomMapper{}) {
println!("i={}", i);
}
}
lib.rs
:
并行管道映射迭代器。
此 crate 向迭代器添加了 plmap 和 scoped_plmap 函数,允许轻松实现管道并行化。由于实现使用了管道,它保留了顺序,但也受到头部阻塞的影响。
示例
并行管道映射
// Import the iterator extension trait.
use plmap::PipelineMap;
// Map over an iterator in parallel with 5 worker threads.
fn example() {
for i in (0..100).plmap(5, |x| x * 2) {
println!("i={}", i);
}
}
范围和并行管道映射
use plmap::ScopedPipelineMap;
fn example() {
crossbeam_utils::thread::scope(|s| {
// Using a thread scope let's you use non 'static lifetimes.
for (i, v) in (0..100).scoped_plmap(s, 5, |x| x * 2).enumerate() {
println!("i={}", i);
}
}).unwrap()
}
使用自己的类型而不是函数进行映射
use plmap::{Mapper, PipelineMap};
// The type must support clone as each worker thread gets a copy.
#[derive(Clone)]
struct CustomMapper {}
impl Mapper<i32> for CustomMapper {
type Out = i64;
fn apply(&mut self, x: i32) -> i64 {
(x * 2) as i64
}
}
fn custom_mapper() {
for i in (0..100).plmap(5, CustomMapper{}) {
println!("i={}", i);
}
}
依赖项
~345KB