You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@Darksonn In other words, the duration should be a multiple of 1 ms. Otherwise, it is rounded up. For example, 17ns should be rounded to 1ms, but 0ms should be rounded to 0ms, not 1ms. Moreover, in the second case, 1s is already a multiple of 1ms, yet the time advances for an extra ms. Note that the time is paused, so there shouldn't be any issues with imprecise sleeping.
Ah I see where the confusion comes from. The problem is the amount of time it takes from the start of the test until the call to time::pause(). Compare with this version that has no time pass before the test is paused:
use tokio::time::{Instant,Duration};#[tokio::main(flavor = "current_thread", start_paused = true)]asyncfnmain(){let now = Instant::now();
tokio::time::sleep_until(now).await;dbg!(Instant::now() - now);// 0 nslet next_at = now + Duration::from_secs(1);
tokio::time::sleep_until(next_at).await;dbg!(Instant::now() - next_at);// 0 ns}
It's not durations that are rounded up to the next millisecond. Rather, the deadline of the sleep is rounded up to the next millisecond "tick" since the runtime started. If some time has already passed since the start of the test, then even a sleep of duration zero is rounded up.
Version
I tested it with
1.35
,1.36
,1.37
, and1.38
.Platform
Ubuntu 20.04.6 LTS, Linux 5.4.0, x86_64.
Description
It seems that Tokio adds an implicit delay of 1ms to any sleeping operation, even if the time is paused:
This behavior is unexpected, to say the least.
Link to the playground
Related to #6390.
The text was updated successfully, but these errors were encountered: