什么是协程?它们与并发性有什么关系?
发布于 2009-02-16 15:46:33
协程和并发在很大程度上是正交的。协程是一种通用的控制结构,通过该结构,流控制在两个不同的例程之间协同传递,而不返回。
Python中的“yield”语句就是一个很好的例子。它创建了一个协程。当遇到“yield”时,保存函数的当前状态,并将控制权返回给调用函数。然后,调用函数可以将执行转移回让利函数,其状态将恢复到遇到“让利”时的点,并继续执行。
发布于 2015-07-01 11:11:12
从Programming in Lua的"Coroutines“部分:
协程类似于线程(在多线程的意义上):它是一条执行线,有自己的堆栈、自己的局部变量和自己的指令指针;但它与其他协程共享全局变量和大多数其他内容。线程和协程之间的主要区别在于,从概念上讲(或从字面上讲,在多处理器机器中),具有线程的程序并行运行多个线程。另一方面,协程是协作的:在任何给定的时间,具有协程的程序只运行其协程中的一个,并且这个正在运行的协程只有在显式地请求挂起时才会暂停执行。
所以重点是:协程是“协作式”的。即使在多核系统中,在任何给定时间也只有一个协程在运行(但多个线程可以并行运行)。协程之间存在非抢占式,正在运行的协程必须显式放弃执行。
对于"concurrency",你可以参考Rob Pike的slide:
并发性是独立执行计算的组合。
因此,在协程A的执行期间,它将控制权传递给协程B。然后,一段时间后,协程B将控制权传递回协程A。由于协程之间存在依赖项,并且它们必须同时运行,因此这两个协程是not concurrency。
发布于 2018-12-07 13:21:21
我发现大多数答案都太技术性了,尽管这是一个技术性的问题。我花了一段时间试图理解协程过程。我有点明白了,但我不是同时明白的。
我发现这里的答案很有帮助:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
引用Idan Arye的话:
在你的故事的基础上,我会这样写:
你开始看动画片,但那是开场白。而不是观看介绍,你切换到游戏并进入在线大堂-但它需要3个玩家,只有你和你的姐姐在其中。而不是等待另一个玩家加入你切换到你的家庭作业,并回答第一个问题。第二个问题有一个你需要观看的YouTube视频的链接。你打开它,它就开始加载了。而不是等待它加载,您切换回卡通。介绍已经结束了,你可以观看了。现在有商业广告--但同时有第三个玩家加入,所以你切换到游戏中,以此类推……
这个想法是,你不能仅仅快速地切换任务,让它看起来像是你在一次做所有的事情。你利用等待某事发生的时间(IO)去做其他需要你直接关注的事情。
绝对检查链接,有更多的,我不能引用一切。
https://stackoverflow.com/questions/553704
复制相似问题