Struct tokio_util::context::TokioContext[][src]

pub struct TokioContext<F> { /* fields omitted */ }
This is supported on crate feature rt only.
Expand description

TokioContext allows running futures that must be inside Tokio’s context on a non-Tokio runtime.

It contains a Handle to the runtime. A handle to the runtime can be obtain by calling the Runtime::handle() method.

Note that the TokioContext wrapper only works if the Runtime it is connected to has not yet been destroyed. You must keep the Runtime alive until the future has finished executing.

Warning: If TokioContext is used together with a current thread runtime, that runtime must be inside a call to block_on for the wrapped future to work. For this reason, it is recommended to use a multi thread runtime, even if you configure it to only spawn one worker thread.

Examples

This example creates two runtimes, but only enables time on one of them. It then uses the context of the runtime with the timer enabled to execute a sleep future on the runtime with timing disabled.

use tokio::time::{sleep, Duration};
use tokio_util::context::RuntimeExt;

// This runtime has timers enabled.
let rt = tokio::runtime::Builder::new_multi_thread()
    .enable_all()
    .build()
    .unwrap();

// This runtime has timers disabled.
let rt2 = tokio::runtime::Builder::new_multi_thread()
    .build()
    .unwrap();

// Wrap the sleep future in the context of rt.
let fut = rt.wrap(async { sleep(Duration::from_millis(2)).await });

// Execute the future on rt2.
rt2.block_on(fut);

Implementations

impl<F> TokioContext<F>[src]

pub fn new(future: F, handle: Handle) -> TokioContext<F>

Notable traits for TokioContext<F>

impl<F: Future> Future for TokioContext<F> type Output = F::Output;
[src]

Associate the provided future with the context of the runtime behind the provided Handle.

This constructor uses a 'static lifetime to opt-out of checking that the runtime still exists.

Examples

This is the same as the example above, but uses the new constructor rather than RuntimeExt::wrap.

use tokio::time::{sleep, Duration};
use tokio_util::context::TokioContext;

// This runtime has timers enabled.
let rt = tokio::runtime::Builder::new_multi_thread()
    .enable_all()
    .build()
    .unwrap();

// This runtime has timers disabled.
let rt2 = tokio::runtime::Builder::new_multi_thread()
    .build()
    .unwrap();

let fut = TokioContext::new(
    async { sleep(Duration::from_millis(2)).await },
    rt.handle().clone(),
);

// Execute the future on rt2.
rt2.block_on(fut);

pub fn handle(&self) -> &Handle[src]

Obtain a reference to the handle inside this TokioContext.

pub fn into_inner(self) -> F[src]

Remove the association between the Tokio runtime and the wrapped future.

Trait Implementations

impl<F: Future> Future for TokioContext<F>[src]

type Output = F::Output

The type of value produced on completion.

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

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

impl<'__pin, F> Unpin for TokioContext<F> where
    __Origin<'__pin, F>: Unpin
[src]

Auto Trait Implementations

impl<F> !RefUnwindSafe for TokioContext<F>

impl<F> Send for TokioContext<F> where
    F: Send

impl<F> Sync for TokioContext<F> where
    F: Sync

impl<F> !UnwindSafe for TokioContext<F>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<F> IntoFuture for F where
    F: Future
[src]

type Output = <F as Future>::Output

🔬 This is a nightly-only experimental API. (into_future)

The output that the future will produce on completion.

type Future = F

🔬 This is a nightly-only experimental API. (into_future)

Which kind of future are we turning this into?

pub fn into_future(self) -> <F as IntoFuture>::Future[src]

🔬 This is a nightly-only experimental API. (into_future)

Creates a future from a value.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

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

Performs the conversion.

impl<F, T, E> TryFuture for F where
    F: Future<Output = Result<T, E>> + ?Sized
[src]

type Ok = T

The type of successful values yielded by this future

type Error = E

The type of failures yielded by this future

pub fn try_poll(
    self: Pin<&mut F>,
    cx: &mut Context<'_>
) -> Poll<<F as Future>::Output>
[src]

Poll this TryFuture as if it were a Future. Read more

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

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

Performs the conversion.