深入Asyncio异步生成器
Posted ikct2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入Asyncio异步生成器相关的知识,希望对你有一定的参考价值。
Async Generators:yield inside async def functions
如果在async def中使用yield会发生什么,答案就是生成一个异步生成器函数,如果有生成器、协程例如Twisted、Tornado等框架或者yield from的使用经验,就会觉得困惑。
因此在继续学习之前,要先铭记这几个重点:
1. 协程和生成器是完全不同的概念;
2. 异步生成器与普通生成器的用法差不多;
3. 对于有IO的迭代,用async for
替代普通的for
。
前一章用异步迭代器来演示与Redis进行交互,其实用异步生成器更容易。
import asyncio
from aioredis import create_redis
async def main():
redis = await create_redis((‘localhost‘, 6379))
keys = [‘America‘, ‘Africa‘, ‘Europe‘, ‘Asia‘]
async for value in one_at_a_time(redis, keys): # 1
await process(value)
async def one_at_a_time(redis, keys): # 2
for k in keys:
value = await redis.get(k) # 3
yield value # 4
asyncio.get_event_loop().run_until_complete(main())
几乎一样,只是改了个名字;
现在用async def声明函数,并且函数内使用了yield,则可以将其认定为异步生成器函数;
不需要像之前的例子那么复杂,直接让loop来处理;
像一个普通的生成器一样yield值。
就像普通生成器让代码更简短,在异步编程中异步生成器也具有相同的优点,可能对于初学者来说还有些复杂,但是多练习一下就会适应了。
以上是关于深入Asyncio异步生成器的主要内容,如果未能解决你的问题,请参考以下文章
深入理解 python3.4 中 Asyncio 库与 Node.js 的异步 IO 机制