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 并发
40,525 每月下载量
在 62 个 Crates 中使用 (7 个直接使用)
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-unknown
和 wasm32-wasi
目标是这种情况的典型例子。在创建隐式全局线程池时,遇到不支持错误而不是恐慌,Rayon 配置了一个回退模式。
这个回退模式主要像使用单个线程的“池”一样运行,例如设置 RAYON_NUM_THREADS=1
。例如,join
将按顺序执行其两个闭包,因为没有其他线程可以共享工作。然而,由于池不是独立于主线程运行的,所以像 spawn
这样的非阻塞调用可能根本不会执行,除非低优先级的调用如 broadcast
为它们提供了机会。回退模式不会尝试模拟线程抢占或 async
任务切换,但 yield_now
或 yield_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