当前位置:  开发笔记 > 编程语言 > 正文

什么是协程?

如何解决《什么是协程?》经验,为你挑选了5个好方法。

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



1> user21714..:

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

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


直接调用函数和从协程生成函数并将此函数包装到此协程之间有什么区别?
“协程是一种通用控制结构,流控制在两个不同的例程之间协同传递而不返回。” <-这是并发性。您要查找的单词是并行性。
可能更好的解释这两个概念在这个背景下并不真正"正交".你绝对可以画出两个概念彼此相似的方式.在两个或更多事物之间传递控制的想法非常相似.

2> Nan Xiao..:

来自Lua的编程," Coroutines"部分:

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

所以重点是:协同程序是"协作的".即使在多核系统中,在任何给定时间只有一个协程运行(但多个线程可以并行运行).协同程序之间存在非抢占式,运行协程必须明确放弃执行.

对于" concurrency",你可以参考Rob Pike的幻灯片:

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

因此在协程A的执行期间,它将控制传递给协程B.然后经过一段时间后,协程B将控制权传递给协程A.由于协程之间存在依赖关系,并且它们必须串联运行,因此这两个协程不是并发的.


放弃CPU让*其他任务*运行,并告诉某个特定的其他进程是时候执行它们之间有区别.协同程序执行后者.这在任何意义上都不是独立的.
@ChrisClark我同意你的看法.协同程序是并发的.以下是维基百科的一些引用:*Coroutines与线程非常相似.然而,协同程序是协同多任务的,而线程通常是抢占式多任务.这意味着**它们提供并发性但不提供并行性**.*
协同程序不会独立执行.他们轮流,每个人都在等待另一个人完成部分工作.他们积极协调.这与Rob Pikes对并发的定义相反.
并且:*协作式多任务处理,也称为非抢占式多任务处理,是一种计算机多任务处理方式,操作系统从不启动从正在运行的进程到另一个进程的上下文切换.相反,进程会定期或在空闲或逻辑阻塞时自动产生控制,以便同时运行多个应用程序.*
@ ErickG.Hagstrom:虽然它们不是独立执行的,但每个协同程序的逻辑都可以是独立的,对吧?如果它是正确的,它就像在单核CPU上运行的非抢占式操作系统,一个进程必须放弃CPU让其他任务运行.

3> mr1031011..:

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

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

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

引用Idan Arye的话:

为了建立你的故事,我会这样说:

你开始看动画片,但这是介绍.你没有观看介绍,而是转到游戏并进入在线大厅 - 但它需要3名玩家,只有你和你的妹妹在其中.而不是等待其他玩家加入你切换到你的作业,并回答第一个问题.第二个问题包含指向您需要观看的YouTube视频的链接.你打开它 - 它开始加载.您可以切换回卡通片,而不是等待它加载.介绍结束了,所以你可以观看.现在有广告 - 但同时第三个玩家加入,所以你切换到游戏等等......

我们的想法是,您不仅要快速切换任务,以使其看起来像是在一次性完成任务.您利用等待事情发生的时间(IO)来做其他需要您直接关注的事情.

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


非常简单明了的插图。为此+1。

4> Twinkle..:

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



5> Dhaval Jivan..:

协同程序是Kotlin语言中的强大功能

协同程序是一种编写异步,非阻塞代码的新方法(以及更多)

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

它不会映射到本机线程

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

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

    无堆栈

    Stackful

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

这些是启动协程的功能:

launch{}

async{}

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

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

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有