参考:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000

 

总之协程与异步IO,

 

 

协程coroutine

协程的形式类似函数,但是又有区别

协程内部,可以在任意地方交出当前线程执行控制权,交由别的协程来在这个线程继续执行

等别的协程执行结束,当前协程又可以继续执行,

协程间可以传递数据,类似python的yield语法,它既可以接收参数,又可以输出数据

 

协程之间通过用户态的调用,完成类似的并发


协程与函数区别:

 

和函数调用的一大区别,比如函数A内部调用函数B,那么A是要等B执行完之后,才能继续执行的,他们之间通过栈来控制的

协程不是这样,协程A内部调用协程B,B内部可能也是执行到某一步,又交出控制权,这时A继续执行

 


协程与异步IO的关系:

 

程序执行过程中,一部分是使用cpu进行计算,另一部分,就是通过系统调用,进行IO传输,

同步IO,是要主动地等待系统将数据传输给程序,这时候线程是阻塞的

而CPU资源处于闲置状态,资源的一种浪费

 

这时候一种办法就是多线程或者多进程,不同的线程,有的做IO操作,有的做CPU操作

但是线程多了之后,线程切换成本较高

 

 

另一种办法,就是使用在一个线程内部,使用异步IO

做IO操作的时候,绑定一个callback函数,

线程本身不用等在这个IO操作完成,就可以做别的事情了

系统内核将数据准备好之后,直接调用callback函数,就把该做的事做了

 

一般使用callback来做异步IO代码的问题是,会让代码显得比较碎

 

和协程结合的话,可以让代码非常的友好

一个协程内部,遇到IO操作,就提交一个异步操作,

然后将控制权交给别的协程,

异步操作完成之后,当前协程可以继续执行

 


python 3.4中提供了asyncio库

里面有coroutine和eventloop框架

多个coroutine放在eventloop中循环执行

在一个coroutine函数中,通过调用yield from +一个coroutine 来完成异步的调用

来完成异步操作,执行这步之后,eventloop会执行下一个coroutine

而,一个coroutine 执行完之后,会返回一个数据

这样  就完成了 一个线程并发执行

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090954004980bd351f2cd4cc18c9e6c06d855c498000

 

python3.5之后,一些命令更简单了

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00144661533005329786387b5684be385062a121e834ac7000

 

asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。

asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320981492785ba33cc96c524223b2ea4e444077708d000