首先解释:协程是非抢占式多任务,线程是抢占式多任务。
协程需要编写代码者主动让出控制权,而线程可以无需规划让出控制权的时间点。
协程哪怕没有操作系统干预也可以实现,毕竟任何编程语言自身就能够实现这个结构。早期的多任务大多来自于此。所以协程肯定是早于线程出现的。
最初,抢占式多任务的发明是一个feature,不需要考虑程序在何处被插入,就可以自动的实现多任务。很多人觉得这很方便。
然而后来,线程的弊端慢慢显现,一方面是程序不知道在什么时间点会被抢走焦点因此无法更有效的规划数据访问,二方面是线程需要有额外开销,有大量并行任务时不适合使用线程,例如C10K问题需要在短时间内响应一万个请求,而当时的系统尚不能有效处理一万个线程。
于是,协程重新回到了程序员的视线。因为一方面,协程代码中所有让出控制权的结点都是已知的,不会存在多线程同步方面的相关问题。二方面,协程的开销非常小,成千上万个协程并发也完全没问题。