pub struct BackgroundWorker<C, R> { /* private fields */ }Expand description
A generic background worker that accepts commands of type C and returns
results of type R via a command/response channel pair.
One or more worker threads share a single command channel via
Arc<Mutex<Receiver<C>>> (competing-consumer pattern). An idle worker
automatically picks up the next available command.
§Type parameters
C– command type sent from the UI thread to the worker(s)R– result type sent back from the worker(s) to the UI thread
Implementations§
Source§impl<C: Send + 'static, R: Send + 'static> BackgroundWorker<C, R>
impl<C: Send + 'static, R: Send + 'static> BackgroundWorker<C, R>
Sourcepub fn new<F>(worker_count: usize, process: F) -> Self
pub fn new<F>(worker_count: usize, process: F) -> Self
Spawns worker_count threads, each running process(cmd) -> result in
a loop until the command channel disconnects.
Sourcepub fn new_with_init<T, F, G>(worker_count: usize, init: F, process: G) -> Self
pub fn new_with_init<T, F, G>(worker_count: usize, init: F, process: G) -> Self
Like BackgroundWorker::new, but each worker thread first runs
init() once and passes its value to every process(ctx, cmd) call.
Use this when workers need expensive per-thread state (e.g. an async
runtime) that must not be rebuilt per command. The context never
leaves the thread that created it, so T may be !Send.
Sourcepub fn send(&self, cmd: C)
pub fn send(&self, cmd: C)
Sends a command to the worker pool. The command is delivered to whichever worker thread acquires the lock first.
Logs an error when every worker has already exited: in that state the command cannot be delivered and is dropped, so callers should treat the request as lost.
Sourcepub fn try_receive(&self) -> Option<R>
pub fn try_receive(&self) -> Option<R>
Returns a completed result, or None if none is ready yet.
This never blocks the calling thread.
Trait Implementations§
Auto Trait Implementations§
impl<C, R> !Sync for BackgroundWorker<C, R>
impl<C, R> Freeze for BackgroundWorker<C, R>
impl<C, R> RefUnwindSafe for BackgroundWorker<C, R>
impl<C, R> Send for BackgroundWorker<C, R>
impl<C, R> Unpin for BackgroundWorker<C, R>
impl<C, R> UnsafeUnpin for BackgroundWorker<C, R>
impl<C, R> UnwindSafe for BackgroundWorker<C, R>
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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