Asynchronous 如何将向量作为异步流处理?
在my中,我希望异步读取RSS提要。目前,由于 但是,我有两个问题Asynchronous 如何将向量作为异步流处理?,asynchronous,rust,async-await,Asynchronous,Rust,Async Await,在my中,我希望异步读取RSS提要。目前,由于 但是,我有两个问题 如何将结果加入到Vec(同步结构)中 如何执行该流?我正在考虑使用task::spawn,但它似乎不起作用 如何执行该流?我曾考虑使用task::spawn,但它似乎不起作用 在async/await世界中,异步代码是由执行者执行的,执行者不是标准库的一部分,而是由第三方板条箱提供的,例如任务::spawn仅计划运行async fn的一个实例,而不是实际运行它 如何将结果加入到vec(同步结构)中 rss阅读器的主要功能似乎是f
Vec
(同步结构)中task::spawn
,但它似乎不起作用task::spawn
,但它似乎不起作用
在async/await
世界中,异步代码是由执行者执行的,执行者不是标准库的一部分,而是由第三方板条箱提供的,例如<代码>任务::spawn仅计划运行async fn
的一个实例,而不是实际运行它
如何将结果加入到vec(同步结构)中
rss阅读器的主要功能似乎是f.read
。应该将其转换为异步函数。然后,feed向量将映射为期货向量,期货向量需要轮询才能完成
futures
板条箱有futures::stream::futures\u unordered::FuturesUnordered
来帮助您完成这项工作FuturesUnordered
本身实现了Stream
trait。然后将该流收集到结果向量中,并等待完成,如下所示:
/#tokio={version=“0.2.4”,功能=[“full”]}
//#futures=“0.3.1”
使用tokio::time::delay_进行;
使用futures::stream::StreamText;
使用futures::stream::futures\u unordered::FuturesUnordered;
使用std::error::error;
使用std::time::{Duration,Instant};
#[tokio::main]
异步fn main()->结果{
让我们开始=瞬间::现在();
让feed=(0..10).collect::();
让res=read_feed(feed)。等待;
dbg!(res);
dbg!(start.appeased());
好(())
}
异步fn read_提要(提要:Vec)->Vec{
feeds.iter()
.map(读取源)
收集::()
收集::()
.等待
}
异步fn读取\u提要(提要:&u32)->u32{
延迟(持续时间:从500毫秒开始)。等待;
饲料*2
}
delay\u的
用于模拟潜在的昂贵操作。这也有助于证明这些读数确实在没有任何显式线程相关逻辑的情况下同时发生
这里有一个细微差别。与同步的结果不同,阅读rss提要的结果与提要本身的顺序不再相同,返回的第一个结果将位于前端。您需要以某种方式处理这个问题。所以您会问如何在rust中实现异步?那么大,我很乐意读到关于这个问题的答案,但我认为它太宽泛了。无论如何,您需要运行任务的东西,我认为(唯一的?)一个是一个名为的城市。有很多资源,但我最近没有查看,所以我不知道是否有使用异步功能的更新教程。顺便说一句,我不关心提要在阅读后的显示顺序,所以这不是一个真正的问题。事实上,最烦人的是,我得到的
函数的返回类型必须具有静态已知的大小
,因为我试图返回一个确实大小未知的Vec
。那我怎样才能避免这个问题呢?好吧,我明白了。现在,让这些未来平行运行将是一件好事
self.feeds = self
.feeds
.iter()
.map(|f| f.read(&self.settings))
.collect::<Vec<Feed>>();
self.feeds = stream::from_iter(self.feeds.iter())
.map(|f| f.read(&self.settings))
// ???
.collect::<Vec<Feed>>()
}