pub struct WorkerPool { /* private fields */ }rayon only.Expand description
A rayon thread pool with per-thread Worker state.
Each thread in the pool has its own Worker that can hold arbitrary state via
Worker::init. The state is thread-local and accessible during install
calls.
Worker access is backed by a thread-local RefCell. Keep with_worker
and with_worker_mut closures short and non-yielding: if Rayon runs
another job on the same thread while a borrow is active, re-entrant worker access can panic.
The pool supports multiple init/clear cycles, allowing reuse of the same threads with different state configurations.
The underlying rayon pool is created lazily on first access.
Implementations§
Source§impl WorkerPool
impl WorkerPool
Sourcepub const fn new(num_threads: usize, thread_name_prefix: &'static str) -> Self
pub const fn new(num_threads: usize, thread_name_prefix: &'static str) -> Self
Creates a new lazy WorkerPool with the given number of threads and a thread name prefix.
The underlying rayon pool is not created until the first method that requires it is called.
Thread names follow the pattern "{prefix}-{index:02}".
Sourcepub fn is_initialized(&self) -> bool
pub fn is_initialized(&self) -> bool
Returns true if the underlying rayon pool has been initialized.
Sourcepub fn current_num_threads(&self) -> usize
pub fn current_num_threads(&self) -> usize
Returns the total number of threads in the underlying rayon pool.
Sourcepub fn init<T: 'static>(&self, f: impl Fn(Option<&mut T>) -> T + Sync)
pub fn init<T: 'static>(&self, f: impl Fn(Option<&mut T>) -> T + Sync)
Initializes per-thread Worker state on every thread in the pool.
Sourcepub fn broadcast(&self, num_threads: usize, f: impl Fn(&mut Worker) + Sync)
pub fn broadcast(&self, num_threads: usize, f: impl Fn(&mut Worker) + Sync)
Runs a closure on num_threads threads in the pool, giving mutable access to each
thread’s Worker.
Use this to initialize or re-initialize per-thread state via Worker::init.
Only num_threads threads execute the closure; the rest skip it.
Sourcepub fn install<R: Send>(&self, f: impl FnOnce(&Worker) -> R + Send) -> R
pub fn install<R: Send>(&self, f: impl FnOnce(&Worker) -> R + Send) -> R
Runs a closure on the pool with access to the calling thread’s Worker.
All rayon parallelism (e.g. par_iter) spawned inside the closure executes on this pool.
Each thread can access its own Worker via the provided reference or through additional
WorkerPool::with_worker calls.
Sourcepub fn install_fn<R: Send>(&self, f: impl FnOnce() -> R + Send) -> R
pub fn install_fn<R: Send>(&self, f: impl FnOnce() -> R + Send) -> R
Sourcepub fn spawn_and_wait<R: Send + 'static>(
&self,
f: impl FnOnce() -> R + Send + 'static,
) -> R
pub fn spawn_and_wait<R: Send + 'static>( &self, f: impl FnOnce() -> R + Send + 'static, ) -> R
Runs a closure on this pool, waiting for its result.
Unlike install_fn, this always queues the closure onto this pool
when called from another rayon pool. This avoids Rayon running the closure on the caller’s
worker through its cross-pool install path.
Sourcepub fn in_place_scope<'scope, R>(
&self,
f: impl FnOnce(&Scope<'scope>) -> R,
) -> R
pub fn in_place_scope<'scope, R>( &self, f: impl FnOnce(&Scope<'scope>) -> R, ) -> R
Executes f on this pool using [rayon::in_place_scope], which converts the calling
thread into a worker for the duration — tasks spawned inside the scope run on the pool
and the call blocks until all of them complete.
Sourcepub fn with_worker<R>(f: impl FnOnce(&Worker) -> R) -> R
pub fn with_worker<R>(f: impl FnOnce(&Worker) -> R) -> R
Accesses the current thread’s Worker from within a pool closure.
This is useful for accessing the worker from inside par_iter where the initial &Worker
reference from install belongs to a different thread.
This borrows the thread-local worker for the entire duration of f. Do not yield to Rayon
from inside f if another job could call with_worker_mut on the
same thread. Yield points include parallel iterators, rayon::join, scopes, and waiting in
ThreadPool::install on a different Rayon pool. A cross-pool install may run another job
from the caller’s pool on the same thread while it waits.
Prefer copying or cloning the required worker state in f, returning from this method to
release the borrow, and only then performing work that may yield.
§Panics
Panics if the current thread’s worker is already mutably borrowed, including by a
re-entrant with_worker_mut call.
Sourcepub fn with_worker_mut<R>(f: impl FnOnce(&mut Worker) -> R) -> R
pub fn with_worker_mut<R>(f: impl FnOnce(&mut Worker) -> R) -> R
Mutably accesses the current thread’s Worker from within a pool closure.
This exclusively borrows the thread-local worker for the entire duration of f. The borrow
is not re-entrant: if Rayon runs another job on the same thread before f returns, any call
to with_worker or with_worker_mut from that job will panic.
Do not call operations that can yield to Rayon from inside f when re-entrant worker access
is possible. This includes parallel iterators, rayon::join, scopes, and waiting in
ThreadPool::install on a different Rayon pool. In particular, a cross-pool install
cooperatively runs jobs from the caller’s pool while waiting for the target pool.
Prefer computing updates before entering with_worker_mut, then use this closure only to
apply the update to the worker state.
§Panics
Panics if the current thread’s worker is already borrowed, including by a re-entrant
with_worker or with_worker_mut call.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for WorkerPool
impl !RefUnwindSafe for WorkerPool
impl !UnwindSafe for WorkerPool
impl Send for WorkerPool
impl Sync for WorkerPool
impl Unpin for WorkerPool
impl UnsafeUnpin for WorkerPool
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘwhere
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘwhere
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘwhere
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘwhere
S: Into<Dispatch>,
Source§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 80 bytes