所以重点是: 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.
6 回答
协程和并发在很大程度上是正交的 . 协同程序是一种通用控制结构,其中流控制在两个不同的例程之间协同传递而不返回 .
Python中的'yield'语句就是一个很好的例子 . 它创造了一个协程 . 遇到'yield'时,保存函数的当前状态,并将控制权返回给调用函数 . 然后,调用函数可以将执行转移回让步功能,并且其状态将恢复到遇到“yield”并且将继续执行的程度 .
从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 .
Coroutine类似于子程序/线程 . 不同之处在于,一旦调用者调用了子例程/线程,它就永远不会返回给调用者函数 . 但是,协程可以在执行一些代码后返回给调用者,允许调用者执行一些自己的代码并返回到协程点,在那里它停止执行并从那里继续执行 . 即 . 一个协程有多个入口和出口点
Coroutines是Kotlin语言中的强大功能
Coroutines是一种编写异步,非阻塞代码的新方法(以及更多)
Coroutine是轻量级线程 . 轻量级线程意味着它不会映射到本机线程,因此它不需要在处理器上进行上下文切换,因此它们更快 .
它不映射到本机线程
协同程序和线程都是多任务处理 . 但不同之处在于线程由操作系统和协同程序由用户管理 .
基本上,有两种类型的协同程序:
Stackless
Stackful
Kotlin实现无堆栈协程 - 这意味着协同程序没有自己的堆栈,因此它们不会映射到本机线程 .
这些是启动协程的功能:
您可以从这里了解更多信息:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9
另一方面,在python
gevent
库中是一个基于coroutine
的网络库,它为您提供类似异步网络请求的线程特性,而无需创建和销毁线程的开销 . 使用的coroutine
库是greenlet
.我发现大多数答案都是技术性的,即使这是一个技术问题 . 我很难尝试理解协同程序 . 我有点得到它,但后来我没有得到它 .
我发现这里的答案非常有帮助:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
引用Idan Arye的话:
绝对检查链接,还有更多,我不能引用一切 .