gpt4 book ai didi

asynchronous - 有没有办法创建一个异步流生成器来产生重复调用函数的结果?

转载 作者:行者123 更新时间:2023-11-29 08:28:11 24 4
gpt4 key购买 nike

我想构建一个程序来收集天气更新并将它们表示为流。我想在无限循环中调用 get_weather(),在 finishstart 之间有 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.
}
}

有什么方法可以轻松做到这一点?

get_weather() 花费超过 60 秒时,使用 tokio::timer::Interval 将不起作用:

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 秒。

最佳答案

使用stream::unfold从“ future 的世界”到“流的世界”。我们不需要任何额外的状态,所以我们使用空元组:

use futures::StreamExt; // 0.3.4
use std::time::Duration;
use tokio::time; // 0.2.11

struct Weather;

async fn get_weather() -> Weather {
Weather
}

const BETWEEN: Duration = Duration::from_secs(1);

fn get_weather_stream() -> impl futures::Stream<Item = Weather> {
futures::stream::unfold((), |_| async {
time::delay_for(BETWEEN).await;
let weather = get_weather().await;
Some((weather, ()))
})
}

#[tokio::main]
async fn main() {
get_weather_stream()
.take(3)
.for_each(|_v| async {
println!("Got the weather");
})
.await;
}
% time ./target/debug/example

Got the weather
Got the weather
Got the weather

real 3.085 3085495us
user 0.004 3928us
sys 0.003 3151us

另见:

关于asynchronous - 有没有办法创建一个异步流生成器来产生重复调用函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com