Spec-Zone.ru › Tokio

Функция pause

pub fn pause()
Доступна только при включённых функциях crate 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

Spec-Zone.ru

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