Trait Future
trait Future
A future represents an asynchronous computation, commonly obtained by use of
async.
A future is a value that might not have finished computing yet. This kind of "asynchronous value" makes it possible for a thread to continue doing useful work while it waits for the value to become available.
The poll method
The core method of future, poll, attempts to resolve the future into a
final value. This method does not block if the value is not ready. Instead,
the current task is scheduled to be woken up when it's possible to make
further progress by polling again. The context passed to the poll
method can provide a Waker, which is a handle for waking up the current
task.
When using a future, you generally won't call poll directly, but instead
.await the value.
Associated Types
type OutputThe type of value produced on completion.
Required Methods
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<<Self as >::Output>Attempts to resolve the future to a final value, registering the current task for wakeup if the value is not yet available.
Return value
This function returns:
Poll::Pendingif the future is not ready yetPoll::Ready(val)with the resultvalof this future if it finished successfully.
Once a future has finished, clients should not
pollit again.When a future is not ready yet,
pollreturnsPoll::Pendingand stores a clone of theWakercopied from the currentContext. ThisWakeris then woken once the future can make progress. For example, a future waiting for a socket to become readable would call.clone()on theWakerand store it. When a signal arrives elsewhere indicating that the socket is readable,Waker::wakeis called and the socket future's task is awoken. Once a task has been woken up, it should attempt topollthe future again, which may or may not produce a final value.Note that on multiple calls to
poll, only theWakerfrom theContextpassed to the most recent call should be scheduled to receive a wakeup.Runtime characteristics
Futures alone are inert; they must be actively
polled for the underlying computation to make progress, meaning that each time the current task is woken up, it should actively re-pollpending futures that it still has an interest in.Having said that, some Futures may represent a value that is being computed in a different task. In this case, the future's underlying computation is simply acting as a conduit for a value being computed by that other task, which will proceed independently of the Future. Futures of this kind are typically obtained when spawning a new task into an async runtime.
The
pollfunction should not be called repeatedly in a tight loop -- instead, it should only be called when the future indicates that it is ready to make progress (by callingwake()). If you're familiar with thepoll(2)orselect(2)syscalls on Unix it's worth noting that futures typically do not suffer the same problems of "all wakeups must poll all events"; they are more likeepoll(4).An implementation of
pollshould strive to return quickly, and should not block. Returning quickly prevents unnecessarily clogging up threads or event loops. If it is known ahead of time that a call topollmay end up taking a while, the work should be offloaded to a thread pool (or something similar) to ensure thatpollcan return quickly.Panics
Once a future has completed (returned
Readyfrompoll), calling itspollmethod again may panic, block forever, or cause other kinds of problems; theFuturetrait places no requirements on the effects of such a call. However, as thepollmethod is not markedunsafe, Rust's usual rules apply: calls must never cause undefined behavior (memory corruption, incorrect use ofunsafefunctions, or the like), regardless of the future's state.