//! Built-in executors and related tools. //! //! All asynchronous computation occurs within an executor, which is //! capable of spawning futures as tasks. This module provides several //! built-in executors, as well as tools for building your own. //! //! All items are only available when the `std` feature of this //! library is activated, and it is activated by default. //! //! # Using a thread pool (M:N task scheduling) //! //! Most of the time tasks should be executed on a [thread pool](ThreadPool). //! A small set of worker threads can handle a very large set of spawned tasks //! (which are much lighter weight than threads). Tasks spawned onto the pool //! with the [`spawn_ok`](ThreadPool::spawn_ok) function will run ambiently on //! the created threads. //! //! # Spawning additional tasks //! //! Tasks can be spawned onto a spawner by calling its [`spawn_obj`] method //! directly. In the case of `!Send` futures, [`spawn_local_obj`] can be used //! instead. //! //! # Single-threaded execution //! //! In addition to thread pools, it's possible to run a task (and the tasks //! it spawns) entirely within a single thread via the [`LocalPool`] executor. //! Aside from cutting down on synchronization costs, this executor also makes //! it possible to spawn non-`Send` tasks, via [`spawn_local_obj`]. The //! [`LocalPool`] is best suited for running I/O-bound tasks that do relatively //! little work between I/O operations. //! //! There is also a convenience function [`block_on`] for simply running a //! future to completion on the current thread. //! //! [`spawn_obj`]: https://docs.rs/futures/0.3/futures/task/trait.Spawn.html#tymethod.spawn_obj //! [`spawn_local_obj`]: https://docs.rs/futures/0.3/futures/task/trait.LocalSpawn.html#tymethod.spawn_local_obj #![cfg_attr(not(feature = "std"), no_std)] #![warn( missing_debug_implementations, missing_docs, rust_2018_idioms, single_use_lifetimes, unreachable_pub )] #![doc(test( no_crate_inject, attr( deny(warnings, rust_2018_idioms, single_use_lifetimes), allow(dead_code, unused_assignments, unused_variables) ) ))] #![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(feature = "std")] mod local_pool; #[cfg(feature = "std")] pub use crate::local_pool::{block_on, block_on_stream, BlockingStream, LocalPool, LocalSpawner}; #[cfg(feature = "thread-pool")] #[cfg_attr(docsrs, doc(cfg(feature = "thread-pool")))] #[cfg(feature = "std")] mod thread_pool; #[cfg(feature = "thread-pool")] #[cfg(feature = "std")] mod unpark_mutex; #[cfg(feature = "thread-pool")] #[cfg_attr(docsrs, doc(cfg(feature = "thread-pool")))] #[cfg(feature = "std")] pub use crate::thread_pool::{ThreadPool, ThreadPoolBuilder}; #[cfg(feature = "std")] mod enter; #[cfg(feature = "std")] pub use crate::enter::{enter, Enter, EnterError};