Структура Sleep
pub struct Sleep { /* private fields */ }
time.Future, возвращаемый функциями sleep и sleep_until.
Этот тип не реализует трейт Unpin, поэтому при использовании с select! или вызове poll его сначала необходимо закрепить (pin). При использовании с .await этого делать не нужно.
Примеры
Подождать 100 мс и вывести «Прошло 100 мс».
use tokio::time::{sleep, Duration};
sleep(Duration::from_millis(100)).await;
println!("100 ms have elapsed");Использование с select!. Если один и тот же Sleep выбирается несколько раз, необходимо закрепить (pin) Sleep с помощью tokio::pin!.
use tokio::time::{self, Duration, Instant};
let sleep = time::sleep(Duration::from_millis(10));
tokio::pin!(sleep);
loop {
tokio::select! {
() = &mut sleep => {
println!("timer elapsed");
sleep.as_mut().reset(Instant::now() + Duration::from_millis(50));
},
}
}Использование в структуре с боксированием. Закрепив Sleep с помощью Box, структура HasSleep реализует Unpin, хотя Sleep этого не реализует.
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::time::Sleep;
struct HasSleep {
sleep: Pin<Box<Sleep>>,
}
impl Future for HasSleep {
type Output = ();
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
self.sleep.as_mut().poll(cx)
}
}Использование в структуре с проекцией pin. Этот способ позволяет избежать Box, однако в результате структура HasSleep не будет Unpin.
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::time::Sleep;
use pin_project_lite::pin_project;
pin_project! {
struct HasSleep {
#[pin]
sleep: Sleep,
}
}
impl Future for HasSleep {
type Output = ();
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
self.project().sleep.poll(cx)
}
}Реализации
impl Sleep
pub fn is_elapsed(&self) -> bool
Возвращает true, если время ожидания Sleep истекло.
Экземпляр Sleep считается завершившимся, когда истекло заданное время ожидания.
pub fn reset(self: Pin<&mut Self>, deadline: Instant)
Сбрасывает экземпляр Sleep, задавая новый срок завершения.
Вызов этой функции позволяет изменить момент времени, в который future Sleep завершится, без создания нового связанного состояния.
Эту функцию можно вызывать как до завершения future, так и после него.
Для вызова этого метода обычно вместе с ним используют Pin::as_mut, который позволяет вызвать метод, не потребляя сам Sleep.
Пример
use tokio::time::{Duration, Instant};
let sleep = tokio::time::sleep(Duration::from_millis(10));
tokio::pin!(sleep);
sleep.as_mut().reset(Instant::now() + Duration::from_millis(20));См. также примеры в начале документа.
Реализации трейтов
Автоматические реализации трейтов
impl !Freeze for Sleep
impl !RefUnwindSafe for Sleep
impl !UnsafeUnpin for Sleep
impl !UnwindSafe for Sleep
impl Send for Sleep
impl Sync for Sleep
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<F> IntoFuture for Fwhere F: Future,
type Output = <F as Future>::Output
type IntoFuture = F
fn into_future(self) -> <F as IntoFuture>::IntoFuture
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/time/struct.Sleep.html