Spec-Zone.ru › Tokio

Структура Notified

pub struct Notified<'a> { /* private fields */ }
Доступно только при включённой функции крейта sync.

Future, возвращаемый методом Notify::notified().

Этот future является слитым: после завершения любые последующие вызовы poll немедленно вернут Poll::Ready.

Реализации

impl Notified<'_>

pub fn enable(self: Pin<&mut Self>) -> bool

Добавляет этот future в список future, готовых получать пробуждения от вызовов notify_one.

Опрос future также добавляет его в список, поэтому этот метод следует использовать только в том случае, если вы хотите добавить future в список до первого вызова poll. (Фактически этот метод эквивалентен вызову poll, за исключением того, что Waker не регистрируется.)

Это не влияет на уведомления, отправленные с помощью notify_waiters: они получаются, если возникают после создания Notified, независимо от того, вызывались ли enable или poll.

Метод возвращает true, если Notified готов. Это происходит в следующих случаях:

  1. Метод notify_waiters был вызван между созданием Notified и вызовом этого метода.
  2. Это первый вызов enable или poll для этого future, и Notify удерживал разрешение, полученное при предыдущем вызове notify_one. В этом случае вызов использует разрешение.
  3. Ранее future был активирован или опрошен, а затем помечен как готовый либо в результате использования разрешения из Notify, либо вызовом notify_one или notify_waiters, который удалил его из списка future, готовых получать пробуждения.

Если этот метод возвращает true, любые последующие вызовы poll для того же future немедленно вернут Poll::Ready.

Примеры

Неограниченный канал «многие производители — многие потребители» (mpmc).

Вызов enable важен, поскольку в противном случае, если параллельно выполняются два вызова recv и два вызова send, может произойти следующее:

  1. Оба вызова try_recv возвращают None.
  2. Оба новых элемента добавляются в вектор.
  3. Метод notify_one вызывается дважды, но в Notify добавляется только одно разрешение.
  4. Оба вызова recv доходят до future Notified. Один из них использует разрешение, а второй засыпает навсегда.

Добавив future Notified в список вызовом enable до try_recv, вызовы notify_one на третьем шаге удалили бы future из списка и пометили их как уведомлённые, вместо того чтобы добавлять разрешение в Notify. Это гарантирует, что оба future будут разбужены.

use tokio::sync::Notify;

use std::collections::VecDeque;
use std::sync::Mutex;

struct Channel<T> {
    messages: Mutex<VecDeque<T>>,
    notify_on_sent: Notify,
}

impl<T> Channel<T> {
    pub fn send(&self, msg: T) {
        let mut locked_queue = self.messages.lock().unwrap();
        locked_queue.push_back(msg);
        drop(locked_queue);

        // Send a notification to one of the calls currently
        // waiting in a call to `recv`.
        self.notify_on_sent.notify_one();
    }

    pub fn try_recv(&self) -> Option<T> {
        let mut locked_queue = self.messages.lock().unwrap();
        locked_queue.pop_front()
    }

    pub async fn recv(&self) -> T {
        let future = self.notify_on_sent.notified();
        tokio::pin!(future);

        loop {
            // Make sure that no wakeup is lost if we get
            // `None` from `try_recv`.
            future.as_mut().enable();

            if let Some(msg) = self.try_recv() {
                return msg;
            }

            // Wait for a call to `notify_one`.
            //
            // This uses `.as_mut()` to avoid consuming the future,
            // which lets us call `Pin::set` below.
            future.as_mut().await;

            // Reset the future in case another call to
            // `try_recv` got the message before us.
            future.set(self.notify_on_sent.notified());
        }
    }
}

Реализации трейтов

impl<'a> Debug for Notified<'a>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Форматирует значение с помощью заданного форматтера. Подробнее

impl Drop for Notified<'_>

fn drop(&mut self)

Выполняет деструктор для этого типа. Подробнее

fn pin_drop(self: Pin<&mut Self>)

🔬Это экспериментальный API, доступный только в ночной версии. (pin_ergonomics)
Выполняет деструктор для этого типа, но, в отличие от Drop::drop, требует, чтобы self был закреплён. Подробнее

impl Future for Notified<'_>

type Output = ()

Тип значения, получаемого при завершении.

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()>

Пытается разрешить future до конечного значения и регистрирует текущую задачу для пробуждения, если значение ещё недоступно. Подробнее

impl<'a> Send for Notified<'a>

impl<'a> Sync for Notified<'a>

Автоматические реализации трейтов

impl<'a> !Freeze for Notified<'a>

impl<'a> !RefUnwindSafe for Notified<'a>

impl<'a> !Unpin for Notified<'a>

impl<'a> !UnsafeUnpin for Notified<'a>

impl<'a> !UnwindSafe for Notified<'a>

Универсальные реализации

impl<T> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId для self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует принадлежащее значение. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует принадлежащее значение. Подробнее

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью предоставленного Span и возвращает обёртку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span и возвращает обёртку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть результат этого преобразования определяется реализацией From<T> for U.

impl<F> IntoFuture for F
where F: Future,

type Output = <F as Future>::Output

Результат, который будет получен при завершении будущего значения.

type IntoFuture = F

В какой тип будущего значения мы преобразуем это значение?

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Создаёт будущее значение из значения. Подробнее

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый в случае ошибки преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый в случае ошибки преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет предоставленный Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Присоединяет текущий по умолчанию Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/futures/struct.Notified.html

Spec-Zone.ru

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