futures::select!和tokio::select有什么区别?

15

我正在使用Tokio,希望能从两个不同的mpsc队列中接收请求。看起来select!是正确的方法,但我不确定futures::select!tokio::select!之间有什么区别。在什么情况下应该使用其中一个而不是另一个?


我认为这不重要。 - Stargateur
2个回答

18
tokio::select!是基于对futures::select!的经验构建的,但改进了一些内容以使其更加人性化。例如,futures-rs版本的select!要求Future实现FusedFuture,而Tokio的版本不再需要这个。

与此相反,Tokio的版本支持宏中的前提条件来涵盖相同的用例。

tokio repo中的PR对此进行了更详细的阐述。

这个变化也被建议应用于futures-rs版本,但迄今为止还没有在那里实现。

如果您的项目已经包含了Tokio,则使用Tokio的版本似乎更可取。但如果您没有并且不想添加额外的依赖关系,则futures-rs版本也可以几乎以相同的方式涵盖大多数用例。主要区别在于,有些Future可能需要通过FutureExt::fuse()扩展方法转换为FusedFuture


3
为了补充@matthias247的回答,相关的一个重要区别是,futures::select!在分支表达式中使用可变引用来获取未完成的future,因此可以在循环中重复使用它们。
另一方面,tokio::select!消耗传递的future。为了获得类似于futures::select!的行为,您需要显式传递一个引用(例如&mut future),并在必要时固定它(例如,如果它是async fn)。Tokio文档中有一个关于此的部分,恢复异步操作
这个线程详细地解释了为什么Tokio决定不使用`FusedFuture`。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接