Функция timeout_ at
pub fn timeout_at<F>(deadline: Instant, future: F) -> Timeout<F::IntoFuture> ⓘwhere
F: IntoFuture,
time.Требует, чтобы Future завершился до указанного момента времени.
Если фьючерс завершается до наступления указанного момента, возвращается полученное значение. В противном случае возвращается ошибка.
Эта функция возвращает фьючерс, тип результата которого — Result<T,Elapsed>, где T — тип результата переданного фьючерса.
Если переданный фьючерс завершается немедленно, то фьючерс, возвращаемый этой функцией, гарантированно завершится немедленно с вариантом Ok независимо от переданного срока.
Отмена
Чтобы отменить тайм-аут, достаточно удалить фьючерс. Дополнительная очистка или другие действия не требуются.
Исходный фьючерс можно получить, вызвав Timeout::into_inner. При этом Timeout потребляется.
Примеры
Создайте Timeout, срок действия которого истекает через 10 миллисекунд.
use tokio::time::{Instant, timeout_at};
use tokio::sync::oneshot;
use std::time::Duration;
let (tx, rx) = oneshot::channel();
// Wrap the future with a `Timeout` set to expire 10 milliseconds into the
// future.
if let Err(_) = timeout_at(Instant::now() + Duration::from_millis(10), rx).await {
println!("did not receive value within 10 ms");
}Паника
Эта функция вызывает панику, если текущий таймер не установлен.
Это может произойти, если в билдер не включены 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_at.html