Function std::thread::available_parallelism

1.59.0 · source ·
pub fn available_parallelism() -> Result<NonZeroUsize>
Expand description

返回程序应该使用的默认并行量的估计值。

并行性是一种资源。给定的机器提供一定的并行能力,即它可以同时执行的计算数量的界限。这个数字通常与计算机拥有的 CPU 数量相对应,但在不同情况下可能会有所不同。

虚拟机或容器编排器等主机环境可能希望限制其中的程序可用的并行量。 这样做通常是为了限制 (非故意地) 资源密集型程序对同一台机器上运行的其他程序的潜在影响。

Limitations

此 API 的目的是提供一种简单且可移植的方式来查询程序应使用的默认并行量。 除其他事项外,它不公开有关 NUMA 区域的信息,不考虑 (协同) 处理器功能或当前系统负载的差异,并且不会为了更准确地查询可用并行度的数量而修改程序的整体状态。

在固定稳态和突发限制都可用的情况下,稳态容量将用于确保更可预测的延迟。

资源限制可以在程序运行时更改,因此该值不会被缓存,而是在每次调用此函数时重新计算。不应从热代码中调用它。

这个函数返回的值应该被认为是任何给定时间可用的实际并行量的简化近似值。 要更详细或更准确地了解程序可用的并行量,您可能还希望使用特定于平台的 API。 以下平台限制目前适用于 available_parallelism

在 Windows 上:

  • 它可能会低估具有超过 64 个逻辑 CPU 的系统上可用的并行量。 但是,程序通常需要特定的支持才能利用超过 64 个逻辑 CPU,而在没有这种支持的情况下,此函数返回的数字准确地反映了程序默认可以使用的逻辑 CPU 的数量。
  • 它可能会过度计算系统上可用的并行量,这些并行量受到进程范围的相似性屏蔽或作业对象限制的限制。

在 Linux 上:

  • 当受进程范围的关联掩码或 cgroup 配额限制并且无法查询 sched_getaffinity() 或 cgroup fs (例如由于沙盒) 时,它可能会高估可用的并行量。
  • 如果当前线程的关联掩码没有反映进程的 cpuset,例如由于固定线程,它可能会低估并行的数量。
  • 如果进程在 cgroup v1 cpu 控制器中,则可能需要扫描挂载点以找到对应的 cgroup v1 控制器,这在具有大量挂载点的系统上可能需要一些时间。 (这不适用于 cgroup v2 或不在 cgroup 中的进程。)

在所有目标上:

  • 当在具有 CPU 使用限制的 VM 中运行时 (例如过载的主机),它可能会过度计算可用的并行量。

Errors

在以下情况下,此函数将返回错误,但不限于此:

  • 如果目标平台的并行量未知。
  • 如果程序没有查询可用的并行量的权限。

Examples

use std::{io, thread};

fn main() -> io::Result<()> {
    let count = thread::available_parallelism()?.get();
    assert!(count >= 1_usize);
    Ok(())
}
Run