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
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()