Struct Handle
struct Handle { ... }
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: &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
use Runtime; let rt = new.unwrap; let _guard = rt.enter; spawn;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.
# use thread; # use 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: &Self, future: F) -> JoinHandle<<F as >::Output> where F: Future + Send + 'static, <F as >::Output: Send + 'staticSpawns 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.See module level documentation for more details.
Examples
use Runtime; #fn spawn_blocking<F, R>(self: &Self, func: F) -> JoinHandle<R> where F: FnOnce() -> R + Send + 'static, R: Send + 'staticRuns the provided function on an executor dedicated to blocking operations.
Examples
use Runtime; #fn block_on<F: Future>(self: &Self, future: F) -> <F as >::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 panics if the provided future panics, if called within an asynchronous execution context, or if a timer future is executed on a runtime that has been shut down.
Examples
use Runtime; // Create the runtime let rt = new.unwrap; // Get a handle from this runtime let handle = rt.handle; // Execute the future, blocking the current thread until completion handle.block_on;Or using
Handle::current:use Handle; asyncfn runtime_flavor(self: &Self) -> RuntimeFlavorReturns the flavor of the current
Runtime.Examples
use ; asyncuse ; asyncfn metrics(self: &Self) -> RuntimeMetricsReturns a view that lets you get information about how the runtime is performing.
impl Clone for Handle
fn clone(self: &Self) -> Handle
impl Debug for Handle
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Freeze for Handle
impl RefUnwindSafe for Handle
impl Send for Handle
impl Sync for Handle
impl Unpin for Handle
impl UnsafeUnpin for Handle
impl UnwindSafe for Handle
impl<T> Any for Handle
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Handle
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Handle
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for Handle
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for Handle
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for Handle
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T, U> Into for Handle
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Handle
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Handle
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>