我正在尝试在Rust异步等待(同时稳定下来)中同时(而不是按顺序)运行期货列表,直到它们中的任何一个解析为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()
(在buffer_unordered()
上),但不知道如何实现。
据我所知,假设您提供了多线程池,也可以使用Stream
之类的东西同时运行期货。但是我不知道如何在这里有效地使用它。
我尝试过类似的操作,但无法正常工作:
join
此外,我正在寻找迭代器中使用的类似join
的东西,以替换if语句或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();
组合。
我将如何处理?