Модуль coop
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для обеспечения кооперативного планирования. -
Restore
OnPending fsилиio-stdилиnetилиprocessилиrtилиsignalилиsyncилиtime - Значение, возвращаемое методом
poll_proceed. - Unconstrained
- Future для метода
unconstrained.
Функции
- consume_
budget - Расходует единицу бюджета и возвращает выполнение среде выполнения Tokio, если кооперативный бюджет задачи исчерпан.
-
cooperative
fsилиio-stdилиnetилиprocessилиrtилиsignalилиsyncилиtime - Создает обертку future, которая обеспечивает взаимодействие внутренней future с планировщиком Tokio.
- has_
budget_ remaining - Возвращает
true, если у задачи еще остался бюджет. -
poll_
proceed fsили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