代码之家  ›  专栏  ›  技术社区  ›  denis631 Oleg

协同路由只是完成处理程序周围的语法糖吗?

  •  5
  • denis631 Oleg  · 技术社区  · 8 年前

    4 回复  |  直到 8 年前
        1
  •  4
  •   s1m0nw1    7 年前

    这不仅仅是句法上的糖分,一点也不。协同程序 不要阻塞 线程,它们只是 执行,因此他们鼓励

    协同路由不依赖于操作系统或JVM的功能(例如,它们不映射到本机线程)。相反,合作和 suspend 函数特别是由编译器生成 状态机 Continuations ,编译器将其作为参数添加到每个挂起函数中;这种技术被称为连续传球方式。

    有关详细信息,请查看 https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

        2
  •  2
  •   Alexey Andreev    8 年前

    不,协同程序不是语法糖。您可以将协同路由视为可以与调用者交互的函数。当你调用一个普通函数时,比如说 foo 必须等到 完成或引发异常。协程是可以将控制权传递回调用方的函数,调用方可以决定是否继续并 什么时候 怎样 协同程序应该继续。这为在其他语言中实现特殊语言结构提供了机会:

    • yield 关键字)类似于C和JavaScript。当用户希望从迭代器中获得新值时,调用方继续执行协同路由。协同路由通过调用传递回调用方 yield() 函数,它还将一些值传递给调用方。
    • 异步/等待类似于C和JavaScript。当未来(类似于任务或承诺)得到解决时,调用方继续执行。协同路由通过调用传递回调用方 await() 等待() 呼叫
    • Go中的Goroutines/Channel。

    suspend fun 语法,然后您可以自己实现这些功能(或从相应的库中获取现有的功能,该库名为 kotlinx.coroutines ).

        3
  •  2
  •   Alexei Kaigorodov    7 年前

        4
  •  1
  •   denis631 Oleg    6 年前

    这里有一篇有趣的文章提到在他们的系统中实现异步/等待: http://joeduffyblog.com/2015/11/19/asynchronous-everything/

    除此之外,我们还添加了wait和async关键字。方法可以标记为异步:

    异步int Foo(){…}

    异步int Bar(){ ... 返回x*x; }

    最初,这只是上面所有回调goop的语法糖,就像在C中一样。然而,最终,我们以性能的名义超越了这一点,添加了轻量级协程和链接堆栈。