#order #streaming #iterator #preserving #computing #multi-threading #fashion

parstream

Crate 用于在多线程的同时保持顺序,以流式方式在迭代器上计算函数。

3 个不稳定版本

0.2.1 2018年12月11日
0.2.0 2018年12月11日
0.1.0 2018年12月10日

#6 in #fashion

MIT/Apache

11KB
128 代码行(不含注释)

parstream crates.io Documentation Build Status dependency status

Crate 用于在多线程的同时保持顺序,以流式方式在迭代器上计算函数。

示例

let xs: &[u64] = &[100, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5];
let mut ys = Vec::new();
let f = |x| x*x;
let res: Result<usize, ()> = parstream::run(
    xs, 4,
    // closure which is called for every x in xs
    |x| {
        std::thread::sleep(std::time::Duration::from_millis(*x));
        Ok(f(x))
    },
    // closure which is called for every result with preserved order
    |y| {
        ys.push(y);
        Ok(())
    },
);
assert_eq!(res, Ok(xs.len()));
assert_eq!(ys, xs.iter().map(f).collect::<Vec<_>>());

如果其中一个回调返回错误,则不会启动新的任务,并且 run 将在清理线程后尽快结束,以便向调用者报告此错误。

#[derive(Eq, PartialEq, Debug)]
struct MyError(usize);
let xs: &[u64] = &[100, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5];
let mut ys = Vec::new();
let f = |x| x*x;
let res = parstream::run(xs.iter().enumerate(), 4,
    |(i, x)| {
        std::thread::sleep(std::time::Duration::from_millis(*x));
        if *x == 0 { return Err(MyError(i)); }
        Ok(f(x))
    },
    |y| {
        ys.push(y);
        Ok(())
    },
);

assert_eq!(res, Err(MyError(5)));
assert_eq!(ys.len(), 0);

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,应如上所述双许可,不附加任何额外条款或条件。

依赖项

~395KB