如果想要等待多个 Future
都完成后返回,对于固定数量的 Future
可以使用 futures 所提供的 join
、join3
、join4
等函数,或者 tokio 所提供的 join!
宏,将多个 Future
合并为一个进行等待。对于不定数量的 Future
,比如有一个 Vec
,则可以使用 futures 的 join_all
函数。
若要在数个 Future
中第一个错误发生时就返回,则可以使用它们对应的 try_join
、try_join3
、try_join4
、try_join_all
等函数以及 try_join!
宏。
如果想要在多个 Future
中的第一个完成后就返回,可以使用 futures 的 select
、select_all
和 select_ok
函数或 tokio 的 select!
宏。
此外,futures 还提供了 FuturesOrdered
和 FuturesUnordered
两个结构,它们将这些 Future
聚合成一个 Stream
逐个返回里面 Future
的结果。其中前者会按照输入的 Future
的顺序返回,而后者则是以任意顺序(可以近似看作按照完成顺序)返回。这两个结构额外提供了 push
方法来动态插入新的 Future
,而且它们只会 poll
被唤醒的 Future
,在 Future
数量较多时可能更高效。前面提到的 join_all
也会在一些情况下会自动使用 FuturesOrdered
来优化。