什么是协程?

什么是协程? 它们与并发有什么关系?

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

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

从Lua编程中 ,“ Coroutines ”部分:

协程类似于一个线程(就多线程而言):它是一个执行线,有自己的栈,自己的局部变量和自己的指令指针; 但它与其他协程共享全局变量和大部分其他内容。 线程和协程之间的主要区别在于,从概念上(或者在多处理器机器中),具有线程的程序并行地运行多个线程。 另一方面,协程是协作的:在任何时候,一个带有协程的程序只运行其一个协程,而这个正在运行的协程只有在明确要求被暂停时才中止执行。

所以重点是: 协程是“协作”的。 即使在多核系统中,在任何给定时间只有一个协程运行(但多个线程可以并行运行)。 在协程之间是非抢先的,运行的协程必须明确地放弃执行。

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

并发是独立执行计算的组成部分。

因此,在协程A执行期间,它将控制传递给协程B.然后,一段时间之后,协程B将控制传递回协程A.因为协程之间存在依赖关系,并且它们必须协同运行,所以这两个协程并不是并发的

协程类似于子程序/线程。 不同之处在于一旦调用者调用子程序/线程,它将永远不会返回到调用者函数。 但是协程可以在执行一段代码后返回给调用者,让调用者执行一些自己的代码,然后返回到协程停止执行的地方并继续执行。 即。 协程有多个入口和出口点

另一方面,在python gevent库是一个基于coroutine的网络库,它为您提供像异步网络请求一样的线程功能,而不需要创建和销毁线程的开销。 使用的coroutine库是greenlet

  • 协程是Kotlin语言的强大功能
  • 协程是一种编写异步非阻塞代码的新方法(还有更多)
  • 协程是轻量级的线程。 轻量级线程意味着它不会映射到本地线程,所以它不需要在处理器上进行上下文切换,所以它们更快。
  • 它不会在本机线程上映射
  • 协程和线程都是多任务处理。 但不同之处在于线程由用户的操作系统和协程来管理。

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

  1. 无堆栈
  2. Stackful

Kotlin实现无堆栈协同程序 – 这意味着协程没有自己的堆栈,所以它们不会映射到本地线程。

这些是启动协程的功能:

 launch{} async{} 

你可以从这里了解更多:

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

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