#thread #join #parallel #performance

rustc-rayon-core

Rayon 核心API - rustc 的分支

10 个版本

0.5.0 2023年3月24日
0.4.1 2022年5月28日
0.3.2 2022年1月10日
0.3.1 2021年3月11日
0.1.1 2018年6月6日

#1093 in 并发

Download history 9836/week @ 2024-03-14 10127/week @ 2024-03-21 9795/week @ 2024-03-28 9978/week @ 2024-04-04 10914/week @ 2024-04-11 11038/week @ 2024-04-18 9851/week @ 2024-04-25 11342/week @ 2024-05-02 10388/week @ 2024-05-09 10821/week @ 2024-05-16 12116/week @ 2024-05-23 11094/week @ 2024-05-30 9510/week @ 2024-06-06 10020/week @ 2024-06-13 10686/week @ 2024-06-20 8681/week @ 2024-06-27

40,525 每月下载量
62 个 Crates 中使用 (7 个直接使用)

MIT/Apache

275KB
4.5K SLoC

注意:这是一个为 rustc 使用的非稳定分支

Rayon-core 代表了 Rayon 的“核心、稳定”API:join、scope 等,以及使用 ThreadPool 创建自定义线程池的能力。

可能值得提及的是:用户不一定需要直接访问 rayon-core;它所有的 API 都在 rayon crate 中有镜像。因此,文档中的示例使用 rayon::join 而不是 rayon_core::join。

rayon-core 旨在其 API 中不进行或不几乎不进行破坏性更改,因为 rayon-core 的每个版本都包含全局线程池(因此如果你有两个同时存在的 rayon-core 版本,你就有两个线程池)。

有关使用 Rayon 的详细信息,请参阅 Rayon 文档

Rayon-core 目前需要 rustc 1.59.0 或更高版本。


lib.rs:

Rayon-core 包含 Rayon 的核心稳定 API。

这些 API 已在 Rayon crate 中镜像,建议从那里使用它们。

join 用于接受两个闭包并在可能的情况下并行运行它们。

  • 如果任务 B 在任务 A 完成之前被窃取,它将并行运行。
  • 如果任务 A 在任务 B 被窃取并可以继续任务 B 之前完成,它将按顺序运行。

scope 创建了一个范围,在其中您可以运行任意数量的并行任务。这些任务可以生成嵌套的任务和范围,但由于工作窃取的性质,执行顺序不能保证。该范围将存在,直到范围内部生成的所有任务都已完成。

spawn 将任务添加到 'static' 或 'global' 范围内,或者由 scope() 函数创建的本地范围。

ThreadPool 可用于创建自己的线程池(使用 ThreadPoolBuilder)或自定义全局线程池。在池内启动的任务(使用 install()join() 等)将被添加到一个双端队列中,在那里它可供本地线程池中的其他线程进行工作窃取。

不支持多线程时的全局回退

Rayon 使用 std API 进行多线程,但一些目标有实现不完整的版本,总是返回 Unsupported 错误。WebAssembly 的 wasm32-unknown-unknownwasm32-wasi 目标是这种情况的典型例子。在创建隐式全局线程池时,遇到不支持错误而不是恐慌,Rayon 配置了一个回退模式。

这个回退模式主要像使用单个线程的“池”一样运行,例如设置 RAYON_NUM_THREADS=1。例如,join 将按顺序执行其两个闭包,因为没有其他线程可以共享工作。然而,由于池不是独立于主线程运行的,所以像 spawn 这样的非阻塞调用可能根本不会执行,除非低优先级的调用如 broadcast 为它们提供了机会。回退模式不会尝试模拟线程抢占或 async 任务切换,但 yield_nowyield_local 也可以主动让出执行时间。

显式 ThreadPoolBuilder 方法总是报告错误而不进行任何回退。

限制多个版本

为了确保线程池之间的适当协调,尤其是确保只有一个全局线程池,rayon-core 会主动限制它自己在一个目标中构建多个版本。您可能会在违规时看到这样的构建错误

error: native library `rayon-core` is being linked to by more
than one package, and can only be linked to by one package

虽然我们努力保持 rayon-core 的 semver 兼容性,但如果不同的包对 rayon-core 有过于严格的波浪线或不等式要求,仍然可能出现这种情况。在构建成功之前,需要解决这些冲突的要求。

依赖项

~640KB
~11K SLoC