一旦你有协同程序,你可以创建管道(haskell:管道,管道; python:生成器)或协作事件循环(python:curio)。一旦你有了期货,你可以做同样的事情;管道(rust:期货-rs)和事件循环(rust:tokio)。由于期货不合作,它们需要基于回调(甚至基于轮询的期货需要回调)调度程序来执行线程或进程池中的阻塞任务。将期货(图书馆级)与协程(语言级)结合起来有什么好处,如这些语言:(python:asyncio),(rust:rfc),(ecmascript 6+)。从根本上说,它们似乎是解决同一问题的相互矛盾的解决方案。
我不是在寻找一个pro / con比较,而且我不认为期货是“一次性”的协程。看看rust,它只使用期货构建了一个基于状态机的整个事件框架。我想知道为什么python / asyncio和javascript都需要coroutines和future。为什么生锈计划在其未来添加协程?它与事件的可组合性有关吗?或者隐含的协同程序堆栈与继续传递期货的显式堆栈?并不是说我完全理解这个论点,因为期货和协程都是使用延续来实现的......或者它与直接与间接风格有关吗?
这些都是不同(虽然相关)的想法,具有不同的权力。
当更强大的工具可用时,为什么要使用效率较低的工具?有时,功能较弱的工具是适合工作的正确工具。使用类型对程序的不变量进行静态编码非常有用,因为它可以让您确定某些内容无法执行的操作。
例如,在对远程服务器进行REST调用时,未来可能就足够了。如果REST客户端暴露了一个生成器,你必须处理它可能产生多次的可能性,即使你知道只有一个结果。如果它暴露了一个协同程序,你必须查阅文档以确定你应该如何与它进行交互 - 即使你实际上只需要做一件事,这在你处理未来时很明显。