Python async await

yield from

Python异步的实现方法是通过对生成器的包装,yield from也是生成器的语法,通过asyncio模块定义的装饰器,我们隐藏了协程内部具体实现的机制,所以使用异步的方式定义任务变得很方便。

import asyncio

@asyncio.coroutine
def hello():
 print(1)
 r = yield from asyncio.sleep(1) # 阻塞 | 可能是在读文件 | 可能是等待网络传输
 print(2)

# loop是个死循环 | 遇到阻塞就下一个任务
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([hello(),hello()])) # 定义两个任务到loop里面
loop.close()

# 结果 | 因为 1 和 2 之间阻塞了,所以第一次 print(1) 之后 继续下一个任务 又 print(1) 一次
1
1
2
2

async await

yield from 是Python3.4版本的异步实现方式,Python3.5版本,直接在语法层面通过 async await 实现了异步模型。

import asyncio

async def hello():
 print(1)
 r = await asyncio.sleep(1) # r 通常是接受一个等待回来的结果
 print(2)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([hello(),hello()]))
loop.close()
Python 教程 Python 入门 Python 时间 Python JSON