Функция 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