Rust-tokio替代了折叠和映射,可以同时运行具有不同输入的函数



我需要一种方法,用不同的输入多次运行同一个函数。由于该函数依赖于速度较慢的web API,因此我需要同时运行它,并将结果收集到一个变量中。我使用以下内容:

use tokio_stream::StreamExt;
async fn run(input: &str) -> Vec<String> {
vec![String::from(input), String::from(input)]
}

async fn main() {
let mut input = tokio_stream::iter(vec!["1","2","3","4","5","6","7","8"]);
let mut handles = vec![];


while let Some(domain) = input.next().await {
handles.push(run(domain));
}

let mut results = vec![];
let mut handles = tokio_stream::iter(handles);
while let Some(handle) = handles.next().await {
results.extend(handle.await);
}
}

我知道有一种方法可以处理期货箱,但我不知道我是否可以将其用于tokio。同样,tokio_stream::StreamExt包含fold和map方法,但如果不调用await,我找不到使用它们的方法。最好的方法是什么?

IIUC根据您的需要,您可以使用tokio::spawn在后台启动任务,使用futures::join_all等待任务全部完成。例如,类似这样的东西(未经测试(:

async fn run(input: &str) -> Vec<String> {
vec![String::from(input), String::from(input)]
}
async fn main() {
let input = vec!["1","2","3","4","5","6","7","8"];
let handles = input.iter().map (|domain| {
tokio::spawn (async move { run (domain).await })
});
let results = futures::join_all (handles).await;
}

最新更新