跳到主要内容

poll_proceed

搜索

函数 poll_proceed 

源代码
pub fn poll_proceed(cx: &mut Context<'_>) -> Poll<RestoreOnPending>
展开描述

如果预算已用尽,则递减任务预算并返回 Poll::Pending。这表明任务应让步给调度器。否则,返回 RestoreOnPending,可用于提交预算消耗。

返回的 RestoreOnPending 在 drop 时会将预算恢复为之前的值,除非调用 RestoreOnPending::made_progress。调用方有责任在调用 poll_proceed能够取得进展时执行此操作。恢复预算会自动确保任务可以尝试以其他方式取得进展。

请注意,RestoreOnPending 将预算恢复为调用 poll_proceed 之前的状态。因此,如果在 poll_proceed 返回到 RestoreOnPending 被 drop 之间预算被进一步调整,则这些调整将被擦除,除非调用方表明已取得进展。

§示例

此示例包装了 futures::channel::mpsc::UnboundedReceiver,以与 Tokio 调度器协作。每次接收到一个值时,都会消耗任务预算。如果预算不可用,则任务将让步给调度器。

use std::pin::Pin;
use std::task::{ready, Context, Poll};
use tokio::task::coop;
use futures::stream::{Stream, StreamExt};
use futures::channel::mpsc::UnboundedReceiver;

struct CoopUnboundedReceiver<T> {
   receiver: UnboundedReceiver<T>,
}

impl<T> Stream for CoopUnboundedReceiver<T> {
    type Item = T;
    fn poll_next(
        mut self: Pin<&mut Self>,
        cx: &mut Context<'_>
    ) -> Poll<Option<T>> {
        let coop = ready!(coop::poll_proceed(cx));
        match self.receiver.poll_next_unpin(cx) {
            Poll::Ready(v) => {
                // We received a value, so consume budget.
                coop.made_progress();
                Poll::Ready(v)
            }
            Poll::Pending => Poll::Pending,
       }
    }
}