菜鸟教程


异步回调确实不用阻塞,不过它有两宗罪,其一:割裂了原来的代码业务逻辑,其二:陷入回调地狱难以维护。

协程到底是什么?

可让线程遇到阻塞函数后不需切换线程,也不用异步回调还可以继续运行下去,是高并发开发神技。

线程可以在遇到阻塞的地方后,保存执行的上下文,转而去执行别处的代码。待阻塞的请求完成后,再转而回去继续执行。

协程到底是什么?

“什么叫转而去执行别处的代码?什么叫回去继续执行?这函数执行到一半还能中途退出再回来?”

“是的,没错!”

函数执行从进入到return退出,从来都是一气呵成,哪有中途执行一半退出,再回来接着执行的道理?

“一气呵成?恐怕不是吧?线程执行函数中途,遇到时间片用完或者遇到I/O阻塞,就会被操作系统保存上下文后挂起,切换到其他线程。而后等到机会再回过头继续执行,不是吗?”

协程到底是什么?

既然操作系统可以调度管理多个线程,那为何线程不可以调度管理函数的执行?

协程,是一种高并发开发的绝技

协程到底是什么?

“线程是操作系统抽象出来的执行流,由操作系统统一调度管理。那在一个线程中,同样可以抽象出多个执行流,由线程来统一调度管理。这线程之上抽象的执行流就是协程。”

“一个线程怎么会有多个执行流呢?”

线程执行函数遇到阻塞后,可以保存上下文后退出,转而执行别处的代码,这里就从一个执行流转向了另外的执行流。

线程是操作系统在调度管理,那线程里抽象出来的执行流,也就是协程,该怎么调度管理呢?操作系统可以通过时钟中断和系统调用进入内核来剥夺线程的执行权,那线程该如何剥夺协程的执行权来实现调度管理呢?

协程到底是什么?

线程的调度由操作系统来管理,是抢占式调度。而协程不同,协程需要互相配合,主动交出执行权,这也是协程的名字——协作式程序的来历。

“主动交出执行权?如何办到?”

“办法有很多,比如C++帝国有一协程框架,名叫libco,他通过HOOK关键的系统函数来实现调度器的介入。”

“那你们Golang是怎么做的?也是这样吗?”

“我们Golang帝国可不一样,我们先天设计就是支持协程,系统调用都被我们封装好了,应用程序调用时遇到需要阻塞的,像是文件读写Read/Write、Sleep我们的调度器就能有机会介入,去执行调度管理了。”

协程到底是什么?

 

相关文章: