协同为什么有期货?

问题描述 投票:1回答:1

一旦你有协同程序,你可以创建管道(haskell:管道,管道; python:生成器)或协作事件循环(python:curio)。一旦你有了期货,你可以做同样的事情;管道(rust:期货-rs)和事件循环(rust:tokio)。由于期货不合作,它们需要基于回调(甚至基于轮询的期货需要回调)调度程序来执行线程或进程池中的阻塞任务。将期货(图书馆级)与协程(语言级)结合起来有什么好处,如这些语言:(python:asyncio),(rust:rfc),(ecmascript 6+)。从根本上说,它们似乎是解决同一问题的相互矛盾的解决方案。

我不是在寻找一个pro / con比较,而且我不认为期货是“一次性”的协程。看看rust,它只使用期货构建了一个基于状态机的整个事件框架。我想知道为什么python / asyncio和javascript都需要coroutines和future。为什么生锈计划在其未来添加协程?它与事件的可组合性有关吗?或者隐含的协同程序堆栈与继续传递期货的显式堆栈?并不是说我完全理解这个论点,因为期货和协程都是使用延续来实现的......或者它与直接与间接风格有关吗?

rust future theory coroutine event-loop
1个回答
1
投票

这些都是不同(虽然相关)的想法,具有不同的权力。

  • 未来是一种抽象,它允许您开始一个过程,然后在完成该过程后返回到原始调用者选择的处理程序。
  • 生成器比未来更强大,因为它可以多次生成。您可以在生成器之上实现期货。
  • 协程比生成器更强大,因为它可以选择屈服于谁,而不仅仅是调用者。例如,它可以屈服于另一个协程。您可以在协同程序之上实现生成器。

当更强大的工具可用时,为什么要使用效率较低的工具?有时,功能较弱的工具是适合工作的正确工具。使用类型对程序的不变量进行静态编码非常有用,因为它可以让您确定某些内容无法执行的操作。

例如,在对远程服务器进行REST调用时,未来可能就足够了。如果REST客户端暴露了一个生成器,你必须处理它可能产生多次的可能性,即使你知道只有一个结果。如果它暴露了一个协同程序,你必须查阅文档以确定你应该如何与它进行交互 - 即使你实际上只需要做一件事,这在你处理未来时很明显。

© www.soinside.com 2019 - 2024. All rights reserved.