一、异步IO
-
CPU的运行速度远大于磁盘,网络等IO操作。
-
同步IO:CPU发出IO请求,等待IO处理完成,继续进行其他处理。
-
异步IO:CPU发出IO请求,不等待IO处理结果,继续进行其他处理;当IO处理完成通知CPU时,CPU再去处理IO结果。
-
解决同步IO的问题,还可以使用多进程和多线程模型。此时会额外带来线程切换的开销。
二、协程(coroutine)
-
协程有点类似于CPU的中断。
-
和多线程相比,协程的优势:
-
协程在一个线程中执行,没有线程切换的开销。
-
不需要锁机制。因为在同一个线程中,不会存在写冲突。
-
-
python对协程的支持是通过generator实现的。
-
协程相关的方法:
-
首先需要通过co.send(NULL)或next(co),启动协程,将协程运行到yield语句处。
-
通过co.send(msg),切换到协程,在yield语句处继续执行。
-
协程的yield语句,既能够接收消息(通过co.send(msg)发送过来的消息),也能够返回消息。
-
通过co.close()能够关闭协程。
-
三、asyncio
-
asyncio是python3.4版本引入的标准库,内置了对异步IO的支持。
-
asyncio与协程(coroutine)
-
首先通过asyncio提供的@asyncio.coroutine将一个generator标记为coroutine类型;
-
然后在coroutine内部用yield from调用另一个coroutine实现异步操作。
-
-
asyncio的编程模型:
-
asyncio的编程模型是一个消息循环;
-
首先从asyncio模块获取一个EventLoop的引用;
-
然后把需要执行的协程扔到EventLoop中,就实现了异步IO。
-
-
yield from:
-
该语句可以让我们方便的调用另一个generator。
-
异步操作需要在coroutine中通过yield from完成。
-
-
示例代码:
import asyncio
@asyncio.coroutine
def hello():
print("Hello, world!")
r = yield from asyncio.sleep(1)
print("Hello again!")
loop = asyncio.get_event_loop()
loop.run_until_complete( hello() )
loop.close()
四、async/await
-
python3.5版本引入async和await。
-
async/await与asyncio的关系:
-
@asyncio.coroutine等价于async;
-
yield from等价于await。
-
-
示例代码:
import asyncio
async def hello():
print("Hello, world!")
r = await asyncio.sleep(1)
print("Hello again!")
loop = asyncio.get_event_loop()
loop.run_until_complete( hello() )
loop.close()
五、aiohttp
-
asyncio实现了TCP, UDP, SSL等协议。
-
aiohttp则是基于asyncio实现的http框架!。使用前安装pip install aiohttp。