#thread #join #parallel #performance

sys rayon-core-wasm

Rayon的核心API

1个稳定版本

1.10.2 2023年2月25日

#1149并发


用于rayon-wasm

MIT/Apache

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-unknownwasm32-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