Я хочу создать программу, которая собирает обновления погоды и представляет их в виде потока. Я хочу вызвать get_weather()
в бесконечном цикле с задержкой в 60 секунд между завершением и началом.
Упрощенная версия будет выглядеть так:
async fn get_weather() -> Weather { /* ... */ }
fn get_weather_stream() -> impl futures::Stream<Item = Weather> {
loop {
tokio::timer::delay_for(std::time::Duration::from_secs(60)).await;
let weather = get_weather().await;
yield weather; // This is not supported
// Note: waiting for get_weather() stops the timer and avoids overflows.
}
}
Есть ли способ сделать это легко?
Использование tokio::timer::Interval
не будет работать, если get_weather()
занимает более 60 секунд:
fn get_weather_stream() -> impl futures::Stream<Item = Weather> {
tokio::timer::Interval::new_with_delay(std::time::Duration::from_secs(60))
.then(|| get_weather())
}
Если это произойдет, немедленно запустится следующая функция. Я хочу, чтобы между предыдущим get_weather()
запуском и следующим get_weather()
запуском оставалось ровно 60 секунд.