【问题标题】:Why do coroutines have futures?为什么协程有未来?
【发布时间】:2018-09-09 12:56:27
【问题描述】:

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

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

【问题讨论】:

  • 看起来像“生命的意义是什么”?

标签: rust future theory coroutine event-loop


【解决方案1】:

这些都是不同(尽管相关)的想法,具有不同的力量。

  • future 是一种抽象,可让您开始一个进程,然后在进程完成后返回给原始调用者选择的处理程序。

  • generator 比 future 更强大,因为它可以产生多次。您可以在生成器之上实现期货。

  • 协程 比生成器更强大,因为它可以选择让步给谁,而不仅仅是调用者。例如,它可以让步给另一个协程。您可以在协程之上实现生成器。

当有更强大的工具可用时,您为什么要使用功能较弱的工具?有时,功能较弱的工具是适合这项工作的工具。使用类型对程序的不变量进行静态编码很有用,因为它可以让您确定不能做什么。

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

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 2011-11-05
    • 2022-01-11
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多