#pipeline #iterator #pipe #adaptor

ppipe

一个简洁轻量级的库,用于使迭代器管道并发和极快,因此得名 ppipe(并行管道)

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2016年11月19日
0.1.0 2016年11月19日

#870 in 并发

MIT 许可证

6KB

ppipe

一个简洁轻量级、用于使迭代器管道并发和惊人快速的库,因此得名 "ppipe"(并行管道)。

用法

将此内容放入您的 Cargo.toml 文件中

[dependencies]

ppipe = "0.2.0"

然后将此内容添加到您的根模块

extern crate ppipe;

并将此内容添加到您想要使用 ppipe 的任何模块

use ppipe::*;

现在,作用域内的大多数迭代器都应该有 ppipe 方法!

概述

如果您按照上述步骤操作,每个迭代器都应该有 ppipe 方法。该方法接受一个 Option<usize> 参数,可以用来声明您是否想要背压。 ppipe(Some(1000)) 表示您希望并发接收器不保留超过 1000 个值,并在例如 for 循环期间通知发送器阻塞,直到接收器的缓冲区低于 1000。

示例

extern crate ppipe;
use ppipe::*;

// ...

for item in excel_sheet.into_iter()
  .map(do_something)
  .write_out_err(some_err_handling_func)
  .ppipe(None)  // create a thread for the above work
  .map(do_something_else)
  .ppipe(None) // create another thread for the the above work
  // ...
{
  // ...
}

内部工作原理

这个小库的重要性难以用言语表达,请参考此存储库中的 examples 文件夹中的 ppipe_example.rs,我将在下面的解释中引用它。

这个简单示例的目的是演示没有 ppipe 的情况下,每次迭代都会将相应的项目沿着管道移动并执行,在这种情况下,是 for 循环的主体。项目永远不会预先加载到某个缓冲区中,等待迭代变量在强制移动到管道后取得所有权。这几乎不是理想化的;当您有 Rust 强大的并行处理能力时,为什么要限制自己使用串行处理呢?这就是 ppipe 做的事情。有了 ppipe,所有之前的迭代器适配器都会运行,无论迭代什么,在这个例子中,是 for 循环,包括任何之前的 ppipe 适配器,它们正在忙于做自己的事情。每个处理的项目都会放入一个缓冲区,可以随时访问它,如果没有项目在缓冲区中,迭代将简单地阻塞,直到有项目可用,或者如果不再有项目被处理,则中断。这意味着可以在迭代缓冲区中的先前项目时将项目添加到缓冲区,这最终减少了瓶颈并大大提高了性能!

没有运行时依赖项