From d8ed7eb06ece0d17b13d9fd4296caa9b10df27af Mon Sep 17 00:00:00 2001 From: Kevin Reid Date: Sun, 20 Aug 2023 17:02:49 -0700 Subject: [PATCH] `impl AsyncExecutor for tokio::runtime::Handle` This will allow Tokio-based async benching without necessarily having access to the `Runtime` itself (e.g. inside of a `#[tokio::main]` function); a `Handle` is always obtainable via `Handle::current()`. --- CHANGELOG.md | 4 ++++ book/src/user_guide/benchmarking_async.md | 14 +++++++------- src/async_executor.rs | 14 +++++++++++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f7cd1da0..03de84ddf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Added + +- Async benchmarking with Tokio may be done via a `tokio::runtime::Handle`, not only a `tokio::runtime::Runtime` + ## [0.5.1] - 2023-05-26 ### Fixed diff --git a/book/src/user_guide/benchmarking_async.md b/book/src/user_guide/benchmarking_async.md index 2fda66409..ba96bceed 100644 --- a/book/src/user_guide/benchmarking_async.md +++ b/book/src/user_guide/benchmarking_async.md @@ -44,13 +44,13 @@ the same executor that you would use in production. If your executor is not list implement the `criterion::async_executor::AsyncExecutor` trait for it to add support, or send a pull request. -| Crate | Feature | Executor Struct | -| --------- | ----------------------------- | ----------------------------------------------------- | -| Tokio | "async_tokio" | `tokio::runtime::Runtime`, `&tokio::runtime::Runtime` | -| async-std | "async_std" (note underscore) | `AsyncStdExecutor` | -| Smol | "async_smol" | `SmolExecutor` | -| futures | "async_futures" | `FuturesExecutor` | -| Other | "async" | | +| Crate | Feature | Executor Struct | +| --------- | ----------------------------- | ------------------------------------------------------------------ | +| Tokio | "async_tokio" | In `tokio::runtime`, `Runtime`, `&Runtime`, `Handle`, or `&Handle` | +| async-std | "async_std" (note underscore) | `AsyncStdExecutor` | +| Smol | "async_smol" | `SmolExecutor` | +| futures | "async_futures" | `FuturesExecutor` | +| Other | "async" | | ### Considerations when benchmarking async functions diff --git a/src/async_executor.rs b/src/async_executor.rs index a7337fb1f..7f0f14da0 100644 --- a/src/async_executor.rs +++ b/src/async_executor.rs @@ -2,7 +2,7 @@ //! Criterion.rs' async benchmarking support. //! //! Implementations are provided for: -//! * Tokio (implemented directly for tokio::Runtime) +//! * Tokio (implemented directly for `tokio::runtime::Runtime` and `tokio::runtime::Handle`) //! * Async-std //! * Smol //! * The Futures crate @@ -54,6 +54,18 @@ impl AsyncExecutor for &tokio::runtime::Runtime { (*self).block_on(future) } } +#[cfg(feature = "async_tokio")] +impl AsyncExecutor for tokio::runtime::Handle { + fn block_on(&self, future: impl Future) -> T { + self.block_on(future) + } +} +#[cfg(feature = "async_tokio")] +impl AsyncExecutor for &tokio::runtime::Handle { + fn block_on(&self, future: impl Future) -> T { + (*self).block_on(future) + } +} /// Runs futures on the 'async-std' crate's global executor #[cfg(feature = "async_std")]