LocalSpawnPool

Struct LocalSpawnPool 

Source
pub struct LocalSpawnPool(/* private fields */);
Expand description

A pool of tasks to spawn futures and wait for them on a single thread.

It is inspired by and has almost the same functionality as tokio::task::LocalSet, but this standalone crate allows you to avoid importing the whole tokio crate if you don’t need it. Unlike the tokio::task::LocalSet, LocalSpawnPool doesn’t handle panics.

In some cases, it is necessary to run one or more futures that do not implement Send and thus are unsafe to send between threads. In these cases, a LocalSpawnPool may be used to schedule one or more !Send futures to run together on the same thread.

You can use the LocalSpawnPool::run_until function to run a future to completion on the LocalSpawnPool, returning its output (see LocalSpawnPool::run_until for more details). And you can use the LocalSpawnPool::spawn and spawn functions to spawn futures on the LocalSpawnPool. To wait for all the spawned futures to complete, await the LocalSpawnPool itself:

§Awaiting the LocalSpawnPool

Example:

use local_spawn_pool::LocalSpawnPool;

async fn run() {
    let pool = LocalSpawnPool::new();
     
    pool.spawn(async {
        // This future will be spawned inside `pool`
         
        local_spawn_pool::spawn(async {
            // This future will be spawned inside `pool`
             
            local_spawn_pool::spawn(async {
                // This future will be spawned inside `pool`
            });
        });

        local_spawn_pool::spawn(async {
            // This future will be spawned inside `pool`
        });
    });

    pool.await; // Will wait for all the futures inside the local_spawn_pool to complete
}

Awaiting a LocalSpawnPool is !Send.

Implementations§

Source§

impl LocalSpawnPool

Source

pub fn new() -> Self

Returns a new LocalSpawnPool.

Source

pub async fn run_until<F>(&self, future: F) -> F::Output
where F: Future + 'static,

Runs a future to completion on the LocalSpawnPool, returning its output.

This returns a future that runs the given future in a LocalSpawnPool, allowing it to call spawn to spawn additional !Send futures. Any futures spawned on the LocalSpawnPool will be driven in the background until the future passed to run_until completes. When the future passed to run_until finishes, any futures which have not completed will remain on the LocalSpawnPool, and will be driven on subsequent calls to run_until or when awaiting the LocalSpawnPool itself.

Source

pub fn spawn<F>(&self, future: F) -> JoinHandle<F::Output>
where F: Future + 'static,

Spawns a !Send task onto the LocalSpawnPool.

This task is guaranteed to be run on the current thread.

Unlike the free function spawn, this method may be used to spawn local tasks when the LocalSpawnPool is not running. The provided future will start running once the LocalSpawnPool is next started, even if you don’t await the returned JoinHandle.

Trait Implementations§

Source§

impl Default for LocalSpawnPool

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Future for LocalSpawnPool

Source§

type Output = ()

The type of value produced on completion.
Source§

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

Attempts to resolve the future to a final value, registering the current task for wakeup if the value is not yet available. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T
where T: Future + ?Sized,

Source§

fn map<U, F>(self, f: F) -> Map<Self, F>
where F: FnOnce(Self::Output) -> U, Self: Sized,

Map this future’s output to a different type, returning a new future of the resulting type. Read more
Source§

fn map_into<U>(self) -> MapInto<Self, U>
where Self::Output: Into<U>, Self: Sized,

Map this future’s output to a different type, returning a new future of the resulting type. Read more
Source§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where F: FnOnce(Self::Output) -> Fut, Fut: Future, Self: Sized,

Chain on a computation for when a future finished, passing the result of the future to the provided closure f. Read more
Source§

fn left_future<B>(self) -> Either<Self, B>
where B: Future<Output = Self::Output>, Self: Sized,

Wrap this future in an Either future, making it the left-hand variant of that Either. Read more
Source§

fn right_future<A>(self) -> Either<A, Self>
where A: Future<Output = Self::Output>, Self: Sized,

Wrap this future in an Either future, making it the right-hand variant of that Either. Read more
Source§

fn into_stream(self) -> IntoStream<Self>
where Self: Sized,

Convert this future into a single element stream. Read more
Source§

fn flatten(self) -> Flatten<Self>
where Self::Output: Future, Self: Sized,

Flatten the execution of this future when the output of this future is itself another future. Read more
Source§

fn flatten_stream(self) -> FlattenStream<Self>
where Self::Output: Stream, Self: Sized,

Flatten the execution of this future when the successful result of this future is a stream. Read more
Source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Fuse a future such that poll will never again be called once it has completed. This method can be used to turn any Future into a FusedFuture. Read more
Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where F: FnOnce(&Self::Output), Self: Sized,

Do something with the output of a future before passing it on. Read more
Source§

fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
where Self: Sized + Send + 'a,

Wrap the future in a Box, pinning it. Read more
Source§

fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>
where Self: Sized + 'a,

Wrap the future in a Box, pinning it. Read more
Source§

fn unit_error(self) -> UnitError<Self>
where Self: Sized,

Source§

fn never_error(self) -> NeverError<Self>
where Self: Sized,

Source§

fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output>
where Self: Unpin,

A convenience for calling Future::poll on Unpin future types.
Source§

fn now_or_never(self) -> Option<Self::Output>
where Self: Sized,

Evaluates and consumes the future, returning the resulting output if the future is ready after the first call to Future::poll. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<F> IntoFuture for F
where F: Future,

Source§

type Output = <F as Future>::Output

The output that the future will produce on completion.
Source§

type IntoFuture = F

Which kind of future are we turning this into?
Source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Creates a future from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.