【发布时间】:2019-10-04 22:22:37
【问题描述】:
我正在尝试在 Rust async-await(即将稳定)中同时(而不是按顺序)运行期货列表,直到其中任何一个解析为 true。
想象一下有一个Vec<File>,以及为每个文件运行的未来产生一个bool(可能是无序的)。这将是一个简单的顺序实现。
async fn my_function(files: Vec<File>) -> bool {
// Run the future on each file, return early if we received true
for file in files {
if long_future(file).await {
return true;
}
}
false
}
async fn long_future(file: File) -> bool {
// Some long-running task here...
}
这可行,但我想同时运行其中一些期货以加快流程。我遇到了buffer_unordered()(在Stream),但不知道如何实现。
据我了解,考虑到您提供了一个多线程池,也可以使用 join 之类的东西同时运行期货。但我看不出如何在这里有效地使用它。
我尝试过这样的事情,但无法让它工作:
let any_true = futures::stream::iter(files)
.buffer_unordered(4) // Run up to 4 concurrently
.map(|file| long_future(file).await)
.filter(|stop| stop) // Only propagate true values
.next() // Return early on first true
.is_some();
除此之外,我还在寻找迭代器中使用的类似 any 的东西,以替换 if 语句或 filter().next().is_some() 组合。
我该怎么办?
【问题讨论】:
-
我认为
select宏的问题在于,您需要为每个可能完成的未来分支。也许futures::future::select_ok 更好? -
谢谢!我认为
select需要首先覆盖并产生所有分支,但select_ok显然不需要,它允许提前返回,所以这是完美的。
标签: concurrency rust async-await