Function tracing::stdlib::thread::sleep_until

source ·
pub fn sleep_until(deadline: Instant)
🔬This is a nightly-only experimental API. (thread_sleep_until #113752)
Expand description

Puts the current thread to sleep until the specified deadline has passed.

The thread may still be asleep after the deadline specified due to scheduling specifics or platform-dependent functionality. It will never wake before.

This function is blocking, and should not be used in async functions.

§Platform-specific behavior

This function uses sleep internally, see its platform-specific behaviour.

§Examples

A simple game loop that limits the game to 60 frames per second.

#![feature(thread_sleep_until)]
let max_fps = 60.0;
let frame_time = Duration::from_secs_f32(1.0/max_fps);
let mut next_frame = Instant::now();
loop {
    thread::sleep_until(next_frame);
    next_frame += frame_time;
    update();
    render();
}

A slow api we must not call too fast and which takes a few tries before succeeding. By using sleep_until the time the api call takes does not influence when we retry or when we give up

#![feature(thread_sleep_until)]
let deadline = Instant::now() + MAX_DURATION;
let delay = Duration::from_millis(250);
let mut next_attempt = Instant::now();
loop {
    if Instant::now() > deadline {
        break Err(());
    }
    if let Status::Ready(data) = slow_web_api_call() {
        break Ok(data);
    }

    next_attempt = deadline.min(next_attempt + delay);
    thread::sleep_until(next_attempt);
}