跳转至

异步IO

IO (Input/Output),输入和输出。例如,上章节中提到的jsonpickleshelve3个模块做的事情也是数据的读写,数据保存在本地磁盘,即为IO


异步IO

我们之前介绍IO所写的代码,基本都是同步IO同步(Synchronous)异步(Asynchronous)在计算机里是非常重要的2个对立概念。

同步,调用函数后,调用方得等待函数返回结果才能继续往后执行其他函数。

异步,调用方不会理会函数是否已经返回结果,在调用发出后,调用者继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。

比方说:

同步:你去商城买手机,店家去仓库拿货,你在店里等着。

异步:现在你去某东买手机,下单后你该干嘛干嘛,只需等某丰快递打电话送上门,而不用待在家里傻等.

async和await

Python在版本3.5之后全新升级了asyncio库异步IO的支持特性,使用asyncawait就能简单的写出高效的异步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库asyncawait改造洗衣店。

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秒洗完

参考链接: