25个稳定版本

1.12.1 2024年1月17日
1.12.0 2023年9月20日
1.11.0 2023年3月4日
1.10.1 2022年11月19日
0.0.1 2017年3月11日

#637 in 并发

Download history 1255638/week @ 2024-03-14 1304902/week @ 2024-03-21 1263059/week @ 2024-03-28 1282925/week @ 2024-04-04 1283765/week @ 2024-04-11 1256612/week @ 2024-04-18 1202536/week @ 2024-04-25 1219999/week @ 2024-05-02 1210010/week @ 2024-05-09 1254271/week @ 2024-05-16 1202685/week @ 2024-05-23 1366013/week @ 2024-05-30 1327548/week @ 2024-06-06 1352874/week @ 2024-06-13 1392381/week @ 2024-06-20 1159141/week @ 2024-06-27

5,492,379 每月下载量
12,617 个Crate中(21个直接使用)使用

MIT/Apache

250KB
4K SLoC

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.63.0 或更高版本。


lib.rs:

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

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

join用于执行两个闭包,并可能并行运行。

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

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

spawn将任务添加到'静态'或'全局'范围,或由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 有过于严格的波浪线或不等式要求,仍然可能发生这种情况。在构建成功之前,需要解决这些冲突要求。

依赖项

~0.3–1.7MB
~30K SLoC