Функция timeout
pub fn timeout<F>(duration: Duration, future: F) -> Timeout<F::IntoFuture> ⓘwhere
F: IntoFuture,
time.Для завершения Future требуется завершиться до истечения указанного времени.
Если фьючерс завершается до истечения указанного времени, возвращается полученное значение. В противном случае возвращается ошибка, а фьючерс отменяется.
Обратите внимание: фьючерс опрашивается до проверки тайм-аута. Поэтому, если во время выполнения фьючерс не возвращает управление, он может завершиться и превысить тайм-аут без возврата ошибки.
Эта функция возвращает фьючерс, тип результата которого — Result<T,Elapsed>, где T — тип возвращаемого значения переданного фьючерса.
Если переданный фьючерс завершается немедленно, фьючерс, возвращаемый этой функцией, гарантированно завершится немедленно с вариантом Ok независимо от указанной длительности.
Отмена
Чтобы отменить тайм-аут, достаточно удалить фьючерс. Дополнительная очистка или другие действия не требуются.
Исходный фьючерс можно получить, вызвав Timeout::into_inner. При этом Timeout потребляется.
Примеры
Создайте новый Timeout, который истечёт через 10 миллисекунд.
use tokio::time::timeout;
use tokio::sync::oneshot;
use std::time::Duration;
let (tx, rx) = oneshot::channel();
// Wrap the future with a `Timeout` set to expire in 10 milliseconds.
if let Err(_) = timeout(Duration::from_millis(10), rx).await {
println!("did not receive value within 10 ms");
}Панические завершения
Эта функция вызывает панику, если текущий таймер не установлен.
Это может произойти, если в builder не включены Builder::enable_time или Builder::enable_all.
Паника также может возникнуть при создании таймера вне среды выполнения Tokio. Поэтому rt.block_on(sleep(...)) вызывает панику: функция выполняется вне среды выполнения. А rt.block_on(async {sleep(...).await}) не вызывает панику. Это происходит потому, что обёртывание функции в async делает её ленивой, поэтому она успешно выполняется внутри среды выполнения без паники.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/time/fn.timeout.html