Struct Handle
pub struct Handle { /* private fields */ }
Handle to the runtime.
The handle is internally reference-counted and can be freely cloned. A handle can be
obtained using the Runtime::handle method.
Implementations
impl Handle
fn enter(&self) -> EnterGuard<'_>Enters the runtime context. This allows you to construct types that must have an executor available on creation such as
SleeporTcpStream. It will also allow you to call methods such astokio::spawnandHandle::currentwithout panicking.Panics
When calling
Handle::entermultiple times, the returned guards must be dropped in the reverse order that they were acquired. Failure to do so will result in a panic and possible memory leaks.Examples
# #Do not do the following, this shows a scenario that will result in a panic and possible memory leak.
use tokio::runtime::Runtime; let rt1 = Runtime::new().unwrap(); let rt2 = Runtime::new().unwrap(); let enter1 = rt1.enter(); let enter2 = rt2.enter(); drop(enter1); drop(enter2);fn current() -> SelfReturns a
Handleview over the currently runningRuntime.Panics
This will panic if called outside the context of a Tokio runtime. That means that you must call this on one of the threads being run by the runtime, or from a thread with an active
EnterGuard. Calling this from within a thread created bystd::thread::spawn(for example) will cause a panic unless that thread has an activeEnterGuard.Examples
This can be used to obtain the handle of the surrounding runtime from an async block or function running on that runtime.
# #fn try_current() -> Result<Self, TryCurrentError>Returns a Handle view over the currently running Runtime
Returns an error if no Runtime has been started
Contrary to
current, this never panicsfn spawn<F>(&self, future: F) -> JoinHandle<F::Output> where F: Future + Send + 'static, F::Output: Send + 'static,Spawns a future onto the Tokio runtime.
This spawns the given future onto the runtime's executor, usually a thread pool. The thread pool is then responsible for polling the future until it completes.
The provided future will start running in the background immediately when
spawnis called, even if you don't await the returnedJoinHandle(assuming that the runtime is running).See module level documentation for more details.
Examples
# #fn spawn_blocking<F, R>(&self, func: F) -> JoinHandle<R> where F: FnOnce() -> R + Send + 'static, R: Send + 'static,Runs the provided function on an executor dedicated to blocking operations.
Examples
# #fn block_on<F: Future>(&self, future: F) -> F::OutputRuns a future to completion on this
Handle's associatedRuntime.This runs the given future on the current thread, blocking until it is complete, and yielding its resolved result. Any tasks or timers which the future spawns internally will be executed on the runtime.
When this is used on a
current_threadruntime, only theRuntime::block_onmethod can drive the IO and timer drivers, but theHandle::block_onmethod cannot drive them. This means that, when using this method on acurrent_threadruntime, anything that relies on IO or timers will not work unless there is another thread currently callingRuntime::block_onon the same runtime.If the runtime has been shut down
If the
Handle's associatedRuntimehas been shut down (throughRuntime::shutdown_background,Runtime::shutdown_timeout, or by dropping it) andHandle::block_onis used it might return an error or panic. Specifically IO resources will return an error and timers will panic. Runtime independent futures will run as normal.Panics
This function will panic if any of the following conditions are met:
- The provided future panics.
- It is called from within an asynchronous context, such as inside
Runtime::block_on,Handle::block_on, or from a function annotated withtokio::main. - A timer future is executed on a runtime that has been shut down.
Examples
# #Or using
Handle::current:# #Handle::block_onmay be combined withtask::block_in_placeto re-enter the async context of a multi-thread scheduler runtime:# #fn runtime_flavor(&self) -> RuntimeFlavorReturns the flavor of the current
Runtime.Examples
use ; async# #fn id(&self) -> IdReturns the
Idof the currentRuntime.Examples
use Handle; asyncfn name(&self) -> Option<&str>Returns the name of the current
Runtime.Examples
use Handle; asyncfn metrics(&self) -> RuntimeMetricsReturns a view that lets you get information about how the runtime is performing.
Trait Implementations
impl Clone for Handle
fn clone(&self) -> Self
impl Debug for Handle
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl RefUnwindSafe for Handle
impl UnwindSafe for Handle
Auto Trait Implementations
impl Freeze for Handle
impl Send for Handle
impl Sync for Handle
impl Unpin for Handle
impl UnsafeUnpin for Handle
Blanket Implementations
impl<T> Any for Handle
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Handle
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Handle
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Handle
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for Handle
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for Handle
where
T: Clone,
type Owned = T;fn to_owned(&self) -> Tfn clone_into(&self, target: &mut T)
impl<T, U> Into<U> for Handle
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for Handle
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for Handle
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>