协程和线程最大的区别就是:
线程的调度是由内核来调度的,涉及到线程同步的问题。
而协程都是运行在一个线程上的,而且协程释放处理机是由程序员来决定的,天然不涉及到同步问题,因为何时运行此协程,何时退出此协程程序员说了算。
线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
线程是在时间片内切换来实现高并发,这是抢占式调度,时间用尽被剥夺处理机。
而协程是非抢占式调度,一个协程必须主动调用函数释放处理机,否则一直占用处理机执行此协程,其它协程得不到执行。
协程就是一种特殊的函数,普通函数只能执行一次,返回一次,生命周期结束。而协程类似于goto语句,可以在函数执行期间某一行代码让出处理机,去执行其他协程,之后又从这一行代码恢复执行。
所有协程都是在一个线程上运行的,同一时间只能有一个协程在运行,而且协程是主动释放处理机的,不能被抢占,因此对于共享资源不需要加锁。因为多线程严格来说也是分时间片轮流执行,但是多线程是被动释放处理机的,io操作可能操作到一半就切换了,必须对共享资源进行保护。
协程分为对称式协程和非对称式协程
- 对称式协程
在函数中使用yeild释放处理机,入栈,其他所有协程可以竞争获得处理机。对称协程机制一般需要一个调度器的支持,按一定调度算法去选择 yield的目标协程 - 非对称式协程
在函数A中使用yeild释放处理机,只能让调用A的函数(A的调用者)获得处理机。非对称协程只能返回最初调用它的协程。