首页 文章

什么是协程?

提问于
浏览
133

什么是协程?它们如何与并发相关?

6 回答

  • 46

    协程和并发在很大程度上是正交的 . 协同程序是一种通用控制结构,其中流控制在两个不同的例程之间协同传递而不返回 .

    Python中的'yield'语句就是一个很好的例子 . 它创造了一个协程 . 遇到'yield'时,保存函数的当前状态,并将控制权返回给调用函数 . 然后,调用函数可以将执行转移回让步功能,并且其状态将恢复到遇到“yield”并且将继续执行的程度 .

  • 96

    Programming in Lua,“ Coroutines ”部分:

    协程类似于一个线程(在多线程意义上):它是一个执行线,有自己的堆栈,它自己的局部变量,以及它自己的指令指针;但它与其他协同程序共享全局变量和其他任何东西 . 线程和协同程序之间的主要区别在于,从概念上(或在字面上,在多处理器机器中),具有线程的程序并行运行多个线程 . 另一方面,协同程序是协作的:在任何给定时间,具有协同程序的程序仅运行其协同程序之一,并且此运行协程仅在明确请求被挂起时才暂停其执行 .

    所以重点是: Coroutines are "collaborative". Even in multi-core system, there is only one coroutine running at any given time (but multiple threads can run in parallel). There is non-preemptive between coroutines, the running coroutine must relinquish the execution explicitly.

    对于“ concurrency ”,您可以参考Rob Pike的slide

    并发性是独立执行计算的组合 .

    因此在协程A执行期间,它将控制传递给协程B.然后经过一段时间后,协程B将控制权传递给协程A.由于协程之间存在 dependency ,它们必须串联运行,因此两个协同程序是 not concurrency .

  • 4

    Coroutine类似于子程序/线程 . 不同之处在于,一旦调用者调用了子例程/线程,它就永远不会返回给调用者函数 . 但是,协程可以在执行一些代码后返回给调用者,允许调用者执行一些自己的代码并返回到协程点,在那里它停止执行并从那里继续执行 . 即 . 一个协程有多个入口和出口点

  • 3
    • Coroutines是Kotlin语言中的强大功能

    • Coroutines是一种编写异步,非阻塞代码的新方法(以及更多)

    • Coroutine是轻量级线程 . 轻量级线程意味着它不会映射到本机线程,因此它不需要在处理器上进行上下文切换,因此它们更快 .

    • 它不映射到本机线程

    • 协同程序和线程都是多任务处理 . 但不同之处在于线程由操作系统和协同程序由用户管理 .

    基本上,有两种类型的协同程序:

    • Stackless

    • Stackful

    Kotlin实现无堆栈协程 - 这意味着协同程序没有自己的堆栈,因此它们不会映射到本机线程 .

    这些是启动协程的功能:

    launch{}
    
    async{}
    

    您可以从这里了解更多信息:

    https://www.kotlindevelopment.com/deep-dive-coroutines/

    https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9

  • 11

    另一方面,在python gevent 库中是一个基于 coroutine 的网络库,它为您提供类似异步网络请求的线程特性,而无需创建和销毁线程的开销 . 使用的 coroutine 库是 greenlet .

  • 1

    我发现大多数答案都是技术性的,即使这是一个技术问题 . 我很难尝试理解协同程序 . 我有点得到它,但后来我没有得到它 .

    我发现这里的答案非常有帮助:

    https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9

    引用Idan Arye的话:

    为了 Build 你的故事,我会这样说:你开始看动画片,但这是介绍 . 你没有观看介绍,而是转到游戏并进入在线大厅 - 但它需要3名玩家,只有你和你的妹妹在其中 . 而不是等待其他玩家加入你切换到你的作业,并回答第一个问题 . 第二个问题包含指向您需要观看的YouTube视频的链接 . 你打开它 - 它开始加载 . 您可以切换回卡通片,而不是等待它加载 . 介绍结束了,所以你可以观看 . 现在有广告 - 但同时第三个玩家已经加入,所以你切换到游戏等等......这个想法是你不仅要快速切换任务,使它看起来像你一次做的一切 . 你利用了等待事情发生的时间(IO)做其他需要你直接关注的事情 .

    绝对检查链接,还有更多,我不能引用一切 .

相关问题