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 并发
5,492,379 每月下载量
在 12,617 个Crate中(21个直接使用)使用
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-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
有过于严格的波浪线或不等式要求,仍然可能发生这种情况。在构建成功之前,需要解决这些冲突要求。
依赖项
~0.3–1.7MB
~30K SLoC