Skip to main content

TokioExecutor

Struct TokioExecutor 

Source
pub struct TokioExecutor;
Expand description

Executes callable tasks on Tokio’s blocking task pool.

TokioExecutor is a FutureExecutor: its Executor::call and Executor::execute methods return a TokioExecution value that implements Future with Output = Result<R, E>. You obtain the callable’s result by .awaiting (or polling) that future; it is not a resolved Result at return time.

§Semantics

  • call schedules work immediatelyExecutor::call runs tokio::task::spawn_blocking synchronously before it returns. A Tokio runtime must already be active on the current thread when call runs (for example inside an async block executed under Runtime::block_on or #[tokio::main]). Calling call first and only then entering a runtime is wrong: the blocking task was submitted with no runtime at call time.
  • Any normal Tokio entry point works — you are not restricted to Builder::new_current_thread; a multi-thread Runtime or an async handler in a server is fine, as long as call happens while that runtime is running.
  • Await the returned future on Tokio — the TokioExecution polls a JoinHandle; complete it with .await inside the same kind of Tokio-driven async context.
  • Blocking pool — the closure runs on Tokio’s blocking thread pool, not on the core async worker threads, so heavy synchronous work does not starve other async tasks on the runtime.
  • Compared to ThreadPerTaskExecutor — this type reuses Tokio-managed blocking threads (bounded pool) instead of one new std::thread per task, and you await the result instead of calling a blocking TaskHandle::get.

§Examples

The following uses a single-thread Runtime only to keep the snippet self-contained; #[tokio::main] or a multi-thread runtime are equally valid.

use std::io;

use qubit_tokio_executor::{
    Executor,
    TokioExecutor,
};

tokio::runtime::Builder::new_current_thread()
    .enable_all()
    .build()?
    .block_on(async {
        let executor = TokioExecutor;
        let value = executor.call(|| Ok::<i32, io::Error>(40 + 2)).await?;
        assert_eq!(value, 42);
        Ok::<(), io::Error>(())
    })?;

Trait Implementations§

Source§

impl Clone for TokioExecutor

Source§

fn clone(&self) -> TokioExecutor

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TokioExecutor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TokioExecutor

Source§

fn default() -> TokioExecutor

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

impl Executor for TokioExecutor

Source§

fn call<C, R, E>(&self, task: C) -> Self::Execution<R, E>
where C: Callable<R, E> + Send + 'static, R: Send + 'static, E: Display + Send + 'static,

Spawns the callable on Tokio’s blocking task pool.

This method invokes tokio::task::spawn_blocking before returning. A Tokio runtime must be active when this method runs; see TokioExecutor.

§Parameters
  • task - Callable to run on Tokio’s blocking task pool.
§Returns

A TokioExecution that implements Future with Output = Result<R, E>. Await it to obtain the callable’s result.

Source§

type Execution<R, E> = TokioExecution<R, E> where R: Send + 'static, E: Display + Send + 'static

The result carrier returned for one execution. Read more
Source§

fn execute<T, E>(&self, task: T) -> Self::Execution<(), E>
where T: Runnable<E> + Send + 'static, E: Display + Send + 'static,

Executes a runnable task and returns this executor’s result carrier. Read more
Source§

impl Copy for TokioExecutor

Source§

impl FutureExecutor for TokioExecutor

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.