1个稳定版本
1.10.2 | 2023年2月25日 |
---|
#1149在并发
260KB
4.5K 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.56.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
)为它们提供机会。回退模式不会尝试模拟线程预emption 或 async
任务切换。
显式 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