线程是为了解决阻塞和并发的并发问题(在一段时间内执行更多的程序),类似的,协程也是为了在一段时间运行更多的“程序”(应该说是函数)并且避免线程阻塞。
线程和协程解决的并发问题不是一个问题,线程是为了让操作系统并发运行程序,以达到“同时”运行更多程序的目的,而协程是为了让一个线程内的程序并发服务更多内容,一个直观的例子就是一个单线程的服务器程序同时服务多个用户,如何做到服务更多用户?想想线程是怎么来的,我们只需要把这个线程中的程序继续细分,然后像时间片轮转一样不断的去执行这些细分的“子程序”。即使一个这样的“子程序”执行发生阻塞,也不会导致整个线程阻塞,在这个“子程序”阻塞的时候切换到其他“子程序”继续服务,既解决了阻塞的问题,也实现了并发。协程就是线程中可以交替运行的代码片段。
下面说说真实的协程,线程切换是由操作系统的时间片控制的,而协程是程序自己实现的,让协程不断轮流执行才是实现并发,所以实现协程还必须要有一个类似于时间片的结构,不同于线程的切换,协程的切换不是按照时间来算的,而是按照代码既定分配,就是说代码运行到这一行才启动协程,协程是可以由我们程序员自己操控的。