协程, Coroutine

协程别名: 微线程,纤程。英文:Coroutine, Green threads, fibers

传统编程语言中子程序或者函数是层级调用的,函数可以调用其它函数, 调用者需要等待被调用者结束之后继续执行, 函数调用是通过栈实现的. 一个线程就是按顺序执行一个或几个子函数, 函数调用只有一个入口和一个出口.
协程看上去也是函数,但是执行过程中在子程序内部可以中断,然后执行别的函数, 然后再被调度回来执行.

  • 协程比线程有更高的执行效率, 协程没有线程切换的开销
  • 协程在用户空间调度, 不涉及系统调用或任何阻塞调用, 不需要用来守卫关键区块的同步性原语(primitive)比如互斥锁、信号量等,并且不需要来自操作系统的支持
  • 协程不需要多线程的锁机制, 为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
  • 协程是协作式多任务的, 线程典型是抢占式多任务的
  • 因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

使用抢占式调度的线程实现协程,但是会失去某些利益(特别是对硬性实时操作的适合性和相对廉价的相互之间切换)。

协程是语言层级的构造,可看作一种形式的控制流,而线程是系统层级的构造

生成器

生成器,也叫作“半协程”[8],是协程的子集。

https://www.liaoxuefeng.com/wiki/1016959663602400/1017968846697824

https://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B