2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2016年11月19日 |
---|---|
0.1.0 | 2016年11月19日 |
#870 in 并发
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
适配器,它们正在忙于做自己的事情。每个处理的项目都会放入一个缓冲区,可以随时访问它,如果没有项目在缓冲区中,迭代将简单地阻塞,直到有项目可用,或者如果不再有项目被处理,则中断。这意味着可以在迭代缓冲区中的先前项目时将项目添加到缓冲区,这最终减少了瓶颈并大大提高了性能!