异步IO
IO
(Input/Output),输入和输出。例如,上章节中提到的json
,pickle
,shelve
3个模块做的事情也是数据的读写,数据保存在本地磁盘,即为IO
。
异步IO
我们之前介绍IO
所写的代码,基本都是同步IO
,同步(Synchronous)
和异步(Asynchronous)
在计算机里是非常重要的2个对立概念。
同步,调用函数后,调用方得等待函数返回结果才能继续往后执行其他函数。
异步,调用方不会理会函数是否已经返回结果,在调用发出后,调用者继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。
比方说:
同步:你去商城买手机,店家去仓库拿货,你在店里等着。
异步:现在你去某东买手机,下单后你该干嘛干嘛,只需等某丰快递打电话送上门,而不用待在家里傻等.
async和await
Python在版本3.5
之后全新升级了asyncio库
异步IO的支持特性,使用async
和await
就能简单的写出高效的异步IO代码。
假设你是开洗衣店的,你有3台洗衣机,(假设)你现在的业务流程有很大问题,3批衣服放在3台洗衣机里洗,一台洗完才能接着去下一台洗衣机洗下一批衣服。
这种业务场景就是典型的同步场景,需要排队等待。
from time import sleep
def washing1():
sleep(3) # 模拟洗衣机3秒洗完
print('washer1 finished')
def washing2():
sleep(2) # 模拟洗衣机2秒洗完
print('washer2 finished')
def washing3():
sleep(5) # 模拟洗衣机5秒洗完
print('washer3 finished')
washing1()
washing2()
washing3()
#同步执行,花费10秒洗完
接下来,我们使用使用asyncio库
的async
和await
改造洗衣店。
import asyncio
async def washing1():
await asyncio.sleep(3) # 模拟洗衣机3秒洗完
print('washer1 finished')
async def washing2():
await asyncio.sleep(2) # 模拟洗衣机2秒洗完
print('washer2 finished')
async def washing3():
await asyncio.sleep(5) # 模拟洗衣机5秒洗完
print('washer3 finished')
# 1. 创建事件循环
loop = asyncio.get_event_loop()
# 2. 将异步函数加入事件队列
tasks = [washing1(),washing2(),washing3()]
# 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束
loop.run_until_complete(asyncio.wait(tasks))
# 4. 关闭loop
loop.close()
#异步执行,花费5秒洗完