Функция pause
pub fn pause()
test-util и time.Приостанавливает время.
Текущее значение Instant::now() сохраняется, и все последующие вызовы Instant::now() будут возвращать сохранённое значение. Сохранённое значение можно изменить с помощью advance или автоматически продвинуть время, когда среде выполнения больше нечего выполнять. Это влияет только на тип Instant в Tokio, а Instant в std продолжает работать как обычно.
Для приостановки времени требуется среда выполнения Tokio current_thread. Это среда выполнения, используемая по умолчанию в #[tokio::test]. Среду выполнения можно инициализировать с приостановленным временем с помощью метода Builder::start_paused.
Если время нужно приостановить сразу, лучше сделать это с помощью макроса main или test:
#[tokio::main(flavor = "current_thread", start_paused = true)]
async fn main() {
println!("Hello world");
}Паники
Вызывает панику, если время уже заморожено или если функция вызвана вне среды выполнения Tokio current_thread.
Автоматическое продвижение времени
Если время приостановлено и среде выполнения нечего выполнять, часы автоматически переводятся на время следующего ожидающего таймера. Это означает, что Sleep или другие примитивы, основанные на таймерах, могут продвигать текущее время в среде выполнения при ожидании.
Предотвращение автоматического продвижения времени
В некоторых сценариях тестирования может потребоваться оставить часы приостановленными без автоматического продвижения, даже во время ожидания ввода-вывода или других асинхронных операций. Этого можно добиться, обернув операции ввода-вывода в spawn_blocking.
Пока выполняется блокирующая задача, автоматическое продвижение часов временно приостанавливается. Благодаря этому можно дождаться завершения ввода-вывода, не сдвигая приостановленные часы:
use tokio::time::{Duration, Instant};
use tokio::task;
#[tokio::test(start_paused = true)]
async fn test_with_io() {
let start = Instant::now();
// The clock will NOT auto-advance while this blocking task runs
let result = task::spawn_blocking(|| {
// Perform I/O operations here
std::thread::sleep(std::time::Duration::from_millis(10));
42
}).await.unwrap();
// Time has not advanced
assert_eq!(start.elapsed(), Duration::ZERO);
}
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/time/fn.pause.html