Spec-Zone.ru › Tokio

Функция poll_proceed

pub fn poll_proceed(cx: &mut Context<'_>) -> Poll<RestoreOnPending>
Доступно только при включённой возможности crate rt и (возможности crate fs или io-std или net или process или rt или signal или sync или time).

Уменьшает бюджет задачи и возвращает Poll::Pending, если бюджет исчерпан. Это означает, что задача должна уступить управление планировщику. В противном случае возвращает RestoreOnPending, который можно использовать для подтверждения расходования бюджета.

Возвращённый RestoreOnPending восстановит прежнее значение бюджета при удалении, если не был вызван RestoreOnPending::made_progress. Вызывающий код должен сделать это, если после вызова poll_proceed ему удалось добиться прогресса. Автоматическое восстановление бюджета гарантирует, что задача сможет попытаться продвинуться другим способом.

Обратите внимание, что RestoreOnPending восстанавливает бюджет в том состоянии, в котором он был до вызова poll_proceed. Поэтому, если бюджет будет дополнительно скорректирован между моментом возврата poll_proceed и удалением RestoreOnPending, эти изменения будут отменены, если вызывающий код не укажет, что был достигнут прогресс.

Примеры

В этом примере 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,
       }
    }
}

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/task/coop/fn.poll_proceed.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API