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
use crate::task::{self, JoinHandle};

/// 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, T>(f: F) -> JoinHandle<T>
where
    F: FnOnce() -> T + Send + 'static,
    T: Send + 'static,
{
    task::spawn(blocking::unblock(f))
}