gpt4 book ai didi

rust - 按顺序执行 future 集合

转载 作者:行者123 更新时间:2023-11-29 07:52:06 26 4
gpt4 key购买 nike

我有一组 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com