【问题标题】:How are coroutines implemented?协程是如何实现的?
【发布时间】:2011-03-27 01:46:50
【问题描述】:

我有一个关于协程实现的问题。 我首先在 Lua 和 stackless-python 上看到了 coroutine。我可以理解它的概念,以及如何使用yield 关键字,但我不知道它是如何实现的。

我能得到一些关于它们的解释吗?

【问题讨论】:

    标签: scheme implementation coroutine


    【解决方案1】:

    通过压入目标地址来启动协程,然后每个协程切换将当前 PC 与栈顶交换,最终必须弹出以终止协程。

    【讨论】:

    • +1,如果您可以像在 C 或大多数 Smalltalks 中那样访问堆栈(或者如果您已经实现 您自己的堆栈,这基本上是 Stackless Python 和 Lua VM 所做的)。
    • 有趣的是,协程的工作方式与协作多任务操作系统上的进程(或操作系统线程)非常相似。每个进程都在 CPU 上运行,直到它回到内核,此时操作系统保存 PC(和一堆其他东西),选择另一个进程运行并跳转到之前保存的 PC那个过程。每个进程当然都有自己的堆栈,就像协程一样。
    【解决方案2】:

    另请参阅:Implementing “Generator” support in a custom language。生成器基本上是(半)协程的一种有限形式,该问题中讨论的大部分内容也适用于此。

    另外:How are exceptions implemented under the hood? 虽然异常显然与协程有很大不同,但它们都有一些共同点:两者都是高级通用控制流构造。 (其实可以用异常来实现协程,也可以用协程来实现异常。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2012-10-29
      • 2012-01-13
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多