若是在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值。異步編程
就像普通生成器讓代碼更簡短,在異步編程中異步生成器也具備相同的優勢,可能對於初學者來講還有些複雜,可是多練習一下就會適應了。函數