rust - 按顺序执行 future 集合

标签 rust future

我有一组 future ,我想将它们组合成一个单一的 future ,让它们按顺序执行。

我查看了 futures_ordered功能。它似乎按顺序返回结果,但 future 是同时执行的。

我试过 fold future ,将它们与and_then结合起来.然而,这对于类型系统来说很棘手。

let tasks = vec![ok(()), ok(()), ok(())];

let combined_task = tasks.into_iter().fold(
    ok(()),                             // seed
    |acc, task| acc.and_then(|_| task), // accumulator
);

playground

这会产生以下错误:

error[E0308]: mismatched types
  --> src/main.rs:10:21
   |
10 |         |acc, task| acc.and_then(|_| task), // accumulator
   |                     ^^^^^^^^^^^^^^^^^^^^^^ expected struct `futures::FutureResult`, found struct `futures::AndThen`
   |
   = note: expected type `futures::FutureResult<_, _>`
              found type `futures::AndThen<futures::FutureResult<_, _>, futures::FutureResult<(), _>, [closure@src/main.rs:10:34: 10:42 task:_]>`

我可能正在接近这个错误,但我已经没有想法了。

最佳答案

合并 iter_okStream::for_each :

use futures::Stream;
use futures::future::ok;
use futures::stream::iter_ok;

let tasks = vec![ok(()), ok(()), ok(())];

let combined_task = iter_ok::<_, ()>(tasks).for_each(|f| f);

iter_ok 生成传递项目的流,并且从不抛出错误(这就是为什么有时需要修复错误类型)。传递给 for_each 的闭包然后返回为每个项目运行的 Future - 这里只是传入的项目。

for_each 然后驱动每个返回的 future 完成,然后再移动到下一个,就像你想要的那样。它还会在遇到第一个错误时中止,并要求内部 futures 在成功时返回 ()

for_each 本身会返回一个 Future,它将失败(如上所述)或在完成时返回 ()

test tests::bench_variant_buffered ... bench:      22,356 ns/iter (+/- 1,816)
test tests::bench_variant_boxed ...    bench:       8,575 ns/iter (+/- 1,042)
test tests::bench_variant_for_each ... bench:       4,070 ns/iter (+/- 531)

关于rust - 按顺序执行 future 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081740/

相关文章:

Java ExecutorsService 提交一个 FutureTask 获取 Future 返回 null

string - 如何在多个分隔符上拆分字符串(String 或 &str)?

rust - 如何阻止 `cargo clippy` 运行依赖项?

flutter - 如何在 Dart 中取消延迟的 future ?

c++ - 如何在C++中异步调用静态方法?

java - java.util.concurrent.Future 不一致?

scala - Future Recursion Patterns/Future Chaining 任意长度

macros - 简化嵌套循环的 Rust 宏规则

multithreading - 在线程之间发送 Nalgebra VectorN

rust - 为什么一个 Cargo 包只能有一个库目标?