Spec-Zone.ru › Tokio

Функция cooperative

pub fn cooperative<F: Future>(fut: F) -> Coop<F> ⓘ
Доступна только при наличии возможности крейта rt и (возможности крейта fs или io-std или net или process или rt или signal или sync или time).

Создаёт будущее-обёртку, которая позволяет внутреннему будущему взаимодействовать с планировщиком Tokio.

При опросе обёртка сначала вызывает poll_proceed, чтобы расходовать бюджет задачи, и немедленно уступает управление, если бюджет исчерпан. Если бюджет доступен, опрашивается внутреннее будущее. Расходование бюджета окончательно фиксируется с помощью RestoreOnPending::made_progress, если внутреннее будущее завершается окончательным значением.

Примеры

При вызове recv для Receiver канала tokio::sync::mpsc бюджет задачи автоматически расходуется при возврате следующего значения. Благодаря этому задачи, использующие каналы mpsc Tokio, автоматически взаимодействуют с планировщиком.

Если вместо этого вы используете futures::channel::mpsc, автоматического расходования бюджета задачи не произойдёт. В этом примере показано, как использовать cooperative, чтобы каналы futures::channel::mpsc взаимодействовали с планировщиком так же, как каналы Tokio.

use tokio::task::coop::cooperative;
use futures::channel::mpsc::Receiver;
use futures::stream::StreamExt;

async fn receive_next<T>(receiver: &mut Receiver<T>) -> Option<T> {
    // Use `StreamExt::next` to obtain a `Future` that resolves to the next value
    let recv_future = receiver.next();
    // Wrap it a cooperative wrapper
    let coop_future = cooperative(recv_future);
    // And await
    coop_future.await
}

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

Spec-Zone.ru

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