6 个版本

0.3.0 2022年9月18日
0.2.3 2022年9月17日
0.0.1 2022年9月15日

#1871Rust 模式


bupstash 中使用

MIT 许可证

13KB
284

plmap

为 Rust 实现的并行管道映射迭代器。

文档

docs.rs/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::{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