若是在async def中使用yield会发生什么,答案就是生成一个异步生成器函数,若是有生成器、协程例如Twisted、Tornado等框架或者yield from的使用经验,就会以为困惑。redis
所以在继续学习以前,要先铭记这几个重点:
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,则能够将其认定为异步生成器函数;async
不须要像以前的例子那么复杂,直接让loop来处理;ide
像一个普通的生成器同样yield值。异步编程
就像普通生成器让代码更简短,在异步编程中异步生成器也具备相同的优势,可能对于初学者来讲还有些复杂,可是多练习一下就会适应了。函数