[−][src]Struct smol::Task
A spawned future.
Tasks are also futures themselves and yield the output of the spawned future.
When a task is dropped, its gets canceled and won't be polled again. To cancel a task a bit
more gracefully and wait until it stops running, use the cancel()
method.
Tasks that panic get immediately canceled. Awaiting a canceled task also causes a panic.
If the future panics, the panic will be unwound into the run()
invocation that polled it.
However, this does not apply to the blocking executor - it will simply ignore panics and
continue running.
Examples
use smol::Task; // Spawn a task onto the work-stealing executor. let task = Task::spawn(async { println!("Hello from a task!"); 1 + 2 }); // Wait for the task to complete. assert_eq!(task.await, 3);
Implementations
impl<T: 'static> Task<T>
[src]
impl<T: Send + 'static> Task<T>
[src]
pub fn spawn(future: impl Future<Output = T> + Send + 'static) -> Task<T>
[src]
Spawns a future onto the work-stealing executor.
This future may be stolen and polled by any thread calling run()
.
Examples
use smol::Task; let task = Task::spawn(async { 1 + 2 }); assert_eq!(task.await, 3);
pub fn blocking(future: impl Future<Output = T> + Send + 'static) -> Task<T>
[src]
Spawns a future onto the blocking executor.
This future is allowed to block for an indefinite length of time.
For convenience, there is also the blocking!
macro that spawns a blocking tasks and
immediately awaits it.
Examples
Read a line from the standard input:
use smol::Task; use std::io::stdin; let line = Task::blocking(async { let mut line = String::new(); std::io::stdin().read_line(&mut line).unwrap(); line }) .await;
See also examples for blocking!
, iter()
, reader()
, and writer()
.
impl<T, E> Task<Result<T, E>> where
T: Send + 'static,
E: Debug + Send + 'static,
[src]
T: Send + 'static,
E: Debug + Send + 'static,
pub fn unwrap(self) -> Task<T>
[src]
Spawns a new task that awaits and unwraps the result.
The new task will panic if the original task results in an error.
Examples
use smol::{Async, Task}; use std::net::TcpStream; let stream = Task::spawn(async { Async::<TcpStream>::connect("example.com:80").await }) .unwrap() .await;
pub fn expect(self, msg: &str) -> Task<T>
[src]
Spawns a new task that awaits and unwraps the result.
The new task will panic with the provided message if the original task results in an error.
Examples
use smol::{Async, Task}; use std::net::TcpStream; let stream = Task::spawn(async { Async::<TcpStream>::connect("example.com:80").await }) .expect("cannot connect") .await;
impl Task<()>
[src]
pub fn detach(self)
[src]
Detaches the task to let it keep running in the background.
Examples
use smol::{Task, Timer}; use std::time::Duration; Task::spawn(async { loop { println!("I'm a daemon task looping forever."); Timer::after(Duration::from_secs(1)).await; } }) .detach();
impl<T> Task<T>
[src]
pub async fn cancel(self) -> Option<T>
[src]
Cancels the task and waits for it to stop running.
Returns the task's output if it was completed just before it got canceled, or None
if it
didn't complete.
While it's possible to simply drop the Task
to cancel it, this is a cleaner way of
canceling because it also waits for the task to stop running.
Examples
use smol::{Task, Timer}; use std::time::Duration; let task = Task::spawn(async { loop { println!("Even though I'm in an infinite loop, you can still cancel me!"); Timer::after(Duration::from_secs(1)).await; } }); Timer::after(Duration::from_secs(3)).await; task.cancel().await;
Trait Implementations
impl<T: Debug> Debug for Task<T>
[src]
impl<T> Drop for Task<T>
[src]
impl<T> Future for Task<T>
[src]
type Output = T
The type of value produced on completion.
fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output>
[src]
impl<T> Into<JoinHandle<T, ()>> for Task<T>
[src]
fn into(self) -> JoinHandle<T, ()>
[src]
Auto Trait Implementations
impl<T> RefUnwindSafe for Task<T> where
T: RefUnwindSafe,
T: RefUnwindSafe,
impl<T> Send for Task<T> where
T: Send,
T: Send,
impl<T> Sync for Task<T>
impl<T> Unpin for Task<T>
impl<T> UnwindSafe for Task<T> where
T: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T> FutureExt for T where
T: Future + ?Sized,
[src]
T: Future + ?Sized,
fn map<U, F>(self, f: F) -> Map<Self, F> where
F: FnOnce(Self::Output) -> U,
[src]
F: FnOnce(Self::Output) -> U,
fn map_into<U>(self) -> MapInto<Self, U> where
Self::Output: Into<U>,
[src]
Self::Output: Into<U>,
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F> where
F: FnOnce(Self::Output) -> Fut,
Fut: Future,
[src]
F: FnOnce(Self::Output) -> Fut,
Fut: Future,
fn left_future<B>(self) -> Either<Self, B> where
B: Future<Output = Self::Output>,
[src]
B: Future<Output = Self::Output>,
fn right_future<A>(self) -> Either<A, Self> where
A: Future<Output = Self::Output>,
[src]
A: Future<Output = Self::Output>,
fn into_stream(self) -> IntoStream<Self>
[src]
fn flatten(self) -> Flatten<Self> where
Self::Output: Future,
[src]
Self::Output: Future,
fn flatten_stream(self) -> FlattenStream<Self> where
Self::Output: Stream,
[src]
Self::Output: Stream,
fn fuse(self) -> Fuse<Self>
[src]
fn inspect<F>(self, f: F) -> Inspect<Self, F> where
F: FnOnce(&Self::Output),
[src]
F: FnOnce(&Self::Output),
fn catch_unwind(self) -> CatchUnwind<Self> where
Self: UnwindSafe,
[src]
Self: UnwindSafe,
fn shared(self) -> Shared<Self> where
Self::Output: Clone,
[src]
Self::Output: Clone,
fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)
[src]
fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a + Send>> where
Self: Send + 'a,
[src]
Self: Send + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>> where
Self: 'a,
[src]
Self: 'a,
fn unit_error(self) -> UnitError<Self>
[src]
fn never_error(self) -> NeverError<Self>
[src]
fn poll_unpin(&mut self, cx: &mut Context) -> Poll<Self::Output> where
Self: Unpin,
[src]
Self: Unpin,
fn now_or_never(self) -> Option<Self::Output>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<F> IntoFuture for F where
F: Future,
[src]
F: Future,
type Output = <F as Future>::Output
into_future
)The output that the future will produce on completion.
type Future = F
into_future
)Which kind of future are we turning this into?
fn into_future(self) -> <F as IntoFuture>::Future
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<F, T, E> TryFuture for F where
F: Future<Output = Result<T, E>> + ?Sized,
[src]
F: Future<Output = Result<T, E>> + ?Sized,
type Ok = T
The type of successful values yielded by this future
type Error = E
The type of failures yielded by this future
fn try_poll(self: Pin<&mut F>, cx: &mut Context) -> Poll<<F as Future>::Output>
[src]
impl<Fut> TryFutureExt for Fut where
Fut: TryFuture + ?Sized,
[src]
Fut: TryFuture + ?Sized,
fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok> where
Self::Ok: Sink<Item>,
<Self::Ok as Sink<Item>>::Error == Self::Error,
[src]
Self::Ok: Sink<Item>,
<Self::Ok as Sink<Item>>::Error == Self::Error,
fn map_ok<T, F>(self, f: F) -> MapOk<Self, F> where
F: FnOnce(Self::Ok) -> T,
[src]
F: FnOnce(Self::Ok) -> T,
fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E> where
E: FnOnce(Self::Error) -> T,
F: FnOnce(Self::Ok) -> T,
[src]
E: FnOnce(Self::Error) -> T,
F: FnOnce(Self::Ok) -> T,
fn map_err<E, F>(self, f: F) -> MapErr<Self, F> where
F: FnOnce(Self::Error) -> E,
[src]
F: FnOnce(Self::Error) -> E,
fn err_into<E>(self) -> ErrInto<Self, E> where
Self::Error: Into<E>,
[src]
Self::Error: Into<E>,
fn ok_into<U>(self) -> OkInto<Self, U> where
Self::Ok: Into<U>,
[src]
Self::Ok: Into<U>,
fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F> where
F: FnOnce(Self::Ok) -> Fut,
Fut: TryFuture<Error = Self::Error>,
[src]
F: FnOnce(Self::Ok) -> Fut,
Fut: TryFuture<Error = Self::Error>,
fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F> where
F: FnOnce(Self::Error) -> Fut,
Fut: TryFuture<Ok = Self::Ok>,
[src]
F: FnOnce(Self::Error) -> Fut,
Fut: TryFuture<Ok = Self::Ok>,
fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F> where
F: FnOnce(&Self::Ok),
[src]
F: FnOnce(&Self::Ok),
fn inspect_err<F>(self, f: F) -> InspectErr<Self, F> where
F: FnOnce(&Self::Error),
[src]
F: FnOnce(&Self::Error),
fn try_flatten(self) -> TryFlatten<Self, Self::Ok> where
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
[src]
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
fn try_flatten_stream(self) -> TryFlattenStream<Self> where
Self::Ok: TryStream,
<Self::Ok as TryStream>::Error == Self::Error,
[src]
Self::Ok: TryStream,
<Self::Ok as TryStream>::Error == Self::Error,
fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F> where
F: FnOnce(Self::Error) -> Self::Ok,
[src]
F: FnOnce(Self::Error) -> Self::Ok,
fn into_future(self) -> IntoFuture<Self>
[src]
fn try_poll_unpin(
&mut self,
cx: &mut Context
) -> Poll<Result<Self::Ok, Self::Error>> where
Self: Unpin,
[src]
&mut self,
cx: &mut Context
) -> Poll<Result<Self::Ok, Self::Error>> where
Self: Unpin,
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,