Функция poll_ proceed
pub fn poll_proceed(cx: &mut Context<'_>) -> Poll<RestoreOnPending>
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