use crate::task::{JoinHandle, Task}; /// Spawns a blocking task. /// /// The task will be spawned onto a thread pool specifically dedicated to blocking tasks. This /// is useful to prevent long-running synchronous operations from blocking the main futures /// executor. /// /// See also: [`task::block_on`], [`task::spawn`]. /// /// [`task::block_on`]: fn.block_on.html /// [`task::spawn`]: fn.spawn.html /// /// # Examples /// /// Basic usage: /// /// ``` /// # #[cfg(feature = "unstable")] /// # async_std::task::block_on(async { /// # /// use async_std::task; /// /// task::spawn_blocking(|| { /// println!("long-running task here"); /// }) /// .await; /// # /// # }) /// ``` #[cfg_attr(feature = "docs", doc(cfg(unstable)))] #[inline] pub fn spawn_blocking(f: F) -> JoinHandle where F: FnOnce() -> T + Send + 'static, T: Send + 'static, { once_cell::sync::Lazy::force(&crate::rt::RUNTIME); let handle = smol::Task::blocking(async move { f() }).into(); JoinHandle::new(handle, Task::new(None)) }