1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
//! 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_docs, missing_debug_implementations, rust_2018_idioms, unreachable_pub)] // It cannot be included in the published code because this lints have false positives in the minimum required version. #![cfg_attr(test, warn(single_use_lifetimes))] #![warn(clippy::all)] #![doc(test(attr(deny(warnings), 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(feature = "std")] mod unpark_mutex; #[cfg(feature = "thread-pool")] #[cfg_attr(docsrs, doc(cfg(feature = "thread-pool")))] #[cfg(feature = "std")] mod thread_pool; #[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};