pub struct TokioContext<F> { /* private fields */ }
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§
Source§impl<F> TokioContext<F>
impl<F> TokioContext<F>
Sourcepub fn new(future: F, handle: Handle) -> TokioContext<F> ⓘ
pub fn new(future: F, handle: Handle) -> TokioContext<F> ⓘ
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);
Sourcepub fn into_inner(self) -> F
pub fn into_inner(self) -> F
Remove the association between the Tokio runtime and the wrapped future.
Trait Implementations§
Source§impl<F: Future> Future for TokioContext<F>
impl<F: Future> Future for TokioContext<F>
impl<'__pin, F> Unpin for TokioContext<F>where
PinnedFieldsOf<__Origin<'__pin, F>>: Unpin,
Auto Trait Implementations§
impl<F> Freeze for TokioContext<F>where
F: Freeze,
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§
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
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn map<U, F>(self, f: F) -> Map<Self, F>
fn map<U, F>(self, f: F) -> Map<Self, F>
Source§fn map_into<U>(self) -> MapInto<Self, U>
fn map_into<U>(self) -> MapInto<Self, U>
Source§fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
f
. Read moreSource§fn left_future<B>(self) -> Either<Self, B>
fn left_future<B>(self) -> Either<Self, B>
Source§fn right_future<A>(self) -> Either<A, Self>
fn right_future<A>(self) -> Either<A, Self>
Source§fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn flatten_stream(self) -> FlattenStream<Self>
fn flatten_stream(self) -> FlattenStream<Self>
Source§fn fuse(self) -> Fuse<Self>where
Self: Sized,
fn fuse(self) -> Fuse<Self>where
Self: Sized,
poll
will never again be called once it has
completed. This method can be used to turn any Future
into a
FusedFuture
. Read moreSource§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
Source§fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
Source§fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
Source§fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
Source§fn unit_error(self) -> UnitError<Self>where
Self: Sized,
fn unit_error(self) -> UnitError<Self>where
Self: Sized,
Future<Output = T>
into a
TryFuture<Ok = T, Error = ()
>.Source§fn never_error(self) -> NeverError<Self>where
Self: Sized,
fn never_error(self) -> NeverError<Self>where
Self: Sized,
Future<Output = T>
into a
TryFuture<Ok = T, Error = Never
>.