首先,什么是异步?

异步可以理解成:在当前未完成的执行流中,进行中断,转而去执行非当前执行流中的其他代码。

为什么要异步?

其中一个原因是耗时操作,比如io操作,要3秒返回最终结果,此时CPU干嘛呢,总不能干等着什么也不做。

此时,如果把干等的时间释放出来,给其他需要执行的代码,CPU利用率就提高了。

如果此时的耗时操作没有返回最终结果(比如为了拿到http请求的response),转而切到其他地方去执行,这就是异步执行。

Python是怎么做的?

首先,它实现了一个事件循环的东西,可以把它理解成用代码实现了一个调度器(而不像线程,由操作系统来实现调度)。这一套 事件循环 + 异步 的东西叫协程。

协程好在哪里?

如果是多线程,需要操作系统参与调度,而操作系统有用户态和内核态,会涉及系统调用,要做现场保存,上下文环境切换等相关的工作,将会耗费更多CPU计算量。

但如果是协程,是线程内实现的调度,都是在线程内完成(主要看协程的实现方案,有的协程就会涉及多线程),不涉及操作系统层面的调度,只是把干等的时间去干点别的事情,来提高CPU利用率。

什么时候用协程呢?

根据上面的描述,如果有io耗时操作,就可以考虑把这个耗时操作写成协程函数,然后在调用方(也是协程)里面使用:await my_coroutine()

当运行到await的时候就会暂定(底层可以用操作系统中断实现),让事件循环有机会去执行其他协程(而不是阻塞的等io操作的返回)。

这样,协程就能在单线程中做到更高的并发。