Function servo::thread::available_parallelism[][src]

pub fn available_parallelism() -> Result<NonZeroUsize, Error>
🔬 This is a nightly-only experimental API. (available_parallelism)
Expand description

Returns an estimate of the default amount of parallelism a program should use.

Parallelism is a resource. A given machine provides a certain capacity for parallelism, i.e., a bound on the number of computations it can perform simultaneously. This number often corresponds to the amount of CPUs or computer has, but it may diverge in various cases.

Host environments such as VMs or container orchestrators may want to restrict the amount of parallelism made available to programs in them. This is often done to limit the potential impact of (unintentionally) resource-intensive programs on other programs running on the same machine.

Limitations

The purpose of this API is to provide an easy and portable way to query the default amount of parallelism the program should use. Among other things it does not expose information on NUMA regions, does not account for differences in (co)processor capabilities, and will not modify the program’s global state in order to more accurately query the amount of available parallelism.

Resource limits can be changed during the runtime of a program, therefore the value is not cached and instead recomputed every time this function is called. It should not be called from hot code.

The value returned by this function should be considered a simplified approximation of the actual amount of parallelism available at any given time. To get a more detailed or precise overview of the amount of parallelism available to the program, you may wish to use platform-specific APIs as well. The following platform limitations currently apply to available_parallelism:

On Windows:

  • It may undercount the amount of parallelism available on systems with more than 64 logical CPUs. However, programs typically need specific support to take advantage of more than 64 logical CPUs, and in the absence of such support, the number returned by this function accurately reflects the number of logical CPUs the program can use by default.
  • It may overcount the amount of parallelism available on systems limited by process-wide affinity masks, or job object limitations.

On Linux:

  • It may overcount the amount of parallelism available when limited by a process-wide affinity mask, or when affected by cgroup limits.

On all targets:

  • It may overcount the amount of parallelism available when running in a VM with CPU usage limits (e.g. an overcommitted host).

Errors

This function will, but is not limited to, return errors in the following cases:

  • If the amount of parallelism is not known for the target platform.
  • If the program lacks permission to query the amount of parallelism made available to it.

Examples

#![feature(available_parallelism)]
use std::{io, thread};

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