什么是协程?它们如何与并发相关?
协程和并发在很大程度上是正交的.协同程序是一种通用控制结构,其中流控制在两个不同的例程之间协同传递而不返回.
Python中的'yield'语句就是一个很好的例子.它创造了一个协程.遇到'yield'时,保存函数的当前状态,并将控制权返回给调用函数.然后,调用函数可以将执行转移回让步功能,并且其状态将恢复到遇到"yield"并且将继续执行的程度.
来自Lua的编程," Coroutines
"部分:
协程类似于一个线程(在多线程意义上):它是一个执行线,有自己的堆栈,它自己的局部变量,以及它自己的指令指针; 但它与其他协同程序共享全局变量和其他任何东西.线程和协同程序之间的主要区别在于,从概念上(或在字面上,在多处理器机器中),具有线程的程序并行运行多个线程.另一方面,协同程序是协作的:在任何给定时间,具有协同程序的程序仅运行其协同程序之一,并且此运行协程仅在明确请求被挂起时才暂停其执行.
所以重点是:协同程序是"协作的".即使在多核系统中,在任何给定时间只有一个协程运行(但多个线程可以并行运行).协同程序之间存在非抢占式,运行协程必须明确放弃执行.
对于" concurrency
",你可以参考Rob Pike的幻灯片:
并发性是独立执行计算的组合.
因此在协程A的执行期间,它将控制传递给协程B.然后经过一段时间后,协程B将控制权传递给协程A.由于协程之间存在依赖关系,并且它们必须串联运行,因此这两个协程不是并发的.
我发现大多数答案太技术性,即使这是一个技术问题.我很难尝试理解协同程序.我有点得到它,但后来我没有得到它.
我发现这里的答案非常有帮助:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
引用Idan Arye的话:
为了建立你的故事,我会这样说:
你开始看动画片,但这是介绍.你没有观看介绍,而是转到游戏并进入在线大厅 - 但它需要3名玩家,只有你和你的妹妹在其中.而不是等待其他玩家加入你切换到你的作业,并回答第一个问题.第二个问题包含指向您需要观看的YouTube视频的链接.你打开它 - 它开始加载.您可以切换回卡通片,而不是等待它加载.介绍结束了,所以你可以观看.现在有广告 - 但同时第三个玩家加入,所以你切换到游戏等等......
我们的想法是,您不仅要快速切换任务,以使其看起来像是在一次性完成任务.您利用等待事情发生的时间(IO)来做其他需要您直接关注的事情.
绝对检查链接,还有更多,我不能引用一切.
Coroutine类似于子程序/线程.不同之处在于,一旦调用者调用了子例程/线程,它就永远不会返回给调用者函数.但是,协程可以在执行一些代码后返回给调用者,允许调用者执行一些自己的代码并返回到协程点,在那里它停止执行并从那里继续执行.即.一个协程有多个入口和出口点
协同程序是Kotlin语言中的强大功能
协同程序是一种编写异步,非阻塞代码的新方法(以及更多)
Coroutine是轻量级的线程.轻量级线程意味着它不会映射到本机线程,因此它不需要在处理器上进行上下文切换,因此它们更快.
它不会映射到本机线程
协同程序和线程都是多任务处理.但不同之处在于线程由操作系统和协同程序由用户管理.
基本上,有两种类型的协同程序:
无堆栈
Stackful
Kotlin实现无堆栈协程 - 这意味着协同程序没有自己的堆栈,因此它们不会映射到本机线程.
这些是启动协程的功能:
launch{} async{}
您可以从这里了解更多信息:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9