协程与函数线程异步的关系

 
总之协程与异步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 执行完之后,会返回一个数据
这样  就完成了 一个线程并发执行
 
python3.5之后,一些命令更简单了
 
asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/brainstorm/p/7085132.html