Spec-Zone.ru › Tokio

Модуль coop

Доступно только при включенной функции crate rt.

Утилиты для улучшенного кооперативного планирования.

Кооперативное планирование

Один вызов poll для задачи верхнего уровня потенциально может выполнять много работы, прежде чем вернуть Poll::Pending. Если задача выполняется длительное время, не уступая управление исполнителю, она может лишить другие задачи, ожидающие выполнения этим исполнителем, или базовые ресурсы возможности работать. Поскольку в Rust нет среды выполнения, принудительно прервать длительно выполняющуюся задачу сложно. Вместо этого этот модуль предоставляет механизм, позволяющий futures по желанию взаимодействовать с исполнителем, чтобы избежать голодания.

Рассмотрим такую future:

async fn drop_all<I: Stream + Unpin>(mut input: I) {
    while let Some(_) = input.next().await {}
}

Она может показаться безобидной, но подумайте, что произойдет при высокой нагрузке, если входной поток всегда готов. Если мы запустим drop_all, задача никогда не уступит управление и лишит другие задачи и ресурсы того же исполнителя возможности работать.

Чтобы учитывать это, Tokio добавляет явные точки уступки в ряд библиотечных функций, заставляя задачи периодически возвращать управление исполнителю.

unconstrained

При необходимости task::unconstrained позволяет отключить кооперативное планирование Tokio для future. Если future обернута в unconstrained, ее никогда не будут принудительно заставлять уступать управление Tokio. Например:

use tokio::{task, sync::mpsc};

let fut = async {
    let (tx, mut rx) = mpsc::unbounded_channel();

    for i in 0..1000 {
        let _ = tx.send(());
        // This will always be ready. If coop was in effect, this code would be forced to yield
        // periodically. However, if left unconstrained, then this code will never yield.
        rx.recv().await;
    }
};

task::coop::unconstrained(fut).await;

Структуры

Coop
Обертка future, созданная с помощью cooperative для обеспечения кооперативного планирования.
RestoreOnPendingfs или io-std или net или process или rt или signal или sync или time
Значение, возвращаемое методом poll_proceed.
Unconstrained
Future для метода unconstrained.

Функции

consume_budget
Расходует единицу бюджета и возвращает выполнение среде выполнения Tokio, если кооперативный бюджет задачи исчерпан.
cooperativefs или io-std или net или process или rt или signal или sync или time
Создает обертку future, которая обеспечивает взаимодействие внутренней future с планировщиком Tokio.
has_budget_remaining
Возвращает true, если у задачи еще остался бюджет.
poll_proceedfs или io-std или net или process или rt или signal или sync или time
Уменьшает бюджет задачи и возвращает Poll::Pending, если бюджет исчерпан. Это означает, что задача должна уступить управление планировщику. В противном случае возвращает RestoreOnPending, который можно использовать для фиксации расхода бюджета.
unconstrained
Отключает кооперативное планирование для future. Tokio никогда не будет принудительно заставлять эту future уступать управление. Это подвергает ваш сервис риску голодания, если future без ограничений не уступает управление самостоятельно.

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

Spec-Zone.ru

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