测试实例:map-reduce
Rust 使并行数据处理变得非常简单,避免了传统并行处理中常见的诸多问题。
标准库提供了开箱即用的优秀线程原语。这些原语结合 Rust 的所有权概念和别名规则,自动防止了数据竞争。
别名规则(一个可写引用异或多个可读引用)自动防止你操作对其他线程可见的状态。(在需要同步的情况下,可以使用 Mutex
或 Channel
等同步原语。)
在这个例子中,我们将计算一个数字块中所有数字的总和。我们通过将数字块分成小块并分配给不同的线程来完成这个任务。每个线程将计算其小块数字的总和,随后我们将汇总每个线程产生的中间结果。
注意,尽管我们在线程间传递引用,但 Rust 理解我们只是传递只读引用,因此不会发生不安全操作或数据竞争。此外,由于我们传递的引用具有 'static
生命周期,Rust 确保这些线程运行时数据不会被销毁。(当需要在线程间共享非 static
数据时,可以使用 Arc
等智能指针来保持数据存活并避免非 static
生命周期。)
练习
让线程数量依赖于用户输入的数据并不明智。如果用户决定插入大量空格,我们真的想要创建 2,000 个线程吗?修改程序,使数据始终被分割成固定数量的块,这个数量应由程序开头定义的静态常量来确定。