测试用例:map-reduce

Rust 可以非常容易地并行化数据处理,而无需像传统尝试那样带来许多麻烦。

标准库开箱即用地提供了出色的线程原语。这些与 Rust 的所有权和别名规则相结合,可以自动防止数据竞争。

别名规则(一个可写引用 XOR 多个可读引用)会自动阻止您操作对其他线程可见的状态。(在需要同步的地方,有像 MutexChannel 这样的同步原语。)

在这个例子中,我们将计算一个数字块中所有数字的总和。我们将通过将块分成不同的线程来完成此操作。每个线程将对其小块数字求和,随后我们将对每个线程产生的中间和进行求和。

请注意,尽管我们正在跨线程边界传递引用,但 Rust 理解我们仅传递只读引用,因此不会发生不安全或数据竞争。同样,因为我们传递的引用具有 'static 生命周期,Rust 理解我们的数据在这些线程仍在运行时不会被销毁。(当您需要在线程之间共享非 static 数据时,您可以使用像 Arc 这样的智能指针来保持数据存活并避免非 static 生命周期。)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

练习

让线程的数量取决于用户输入的数据是不明智的。如果用户决定插入很多空格会怎么样?我们真的想生成 2,000 个线程吗?修改程序,以便数据始终被分块为有限数量的块,这些块由程序开始时的静态常量定义。

另请参阅