深刻Asyncio(九)異步生成器

Async Generators:yield inside async def functions

若是在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())
  1. 幾乎同樣,只是改了個名字;異步

  2. 如今用async def聲明函數,而且函數內使用了yield,則能夠將其認定爲異步生成器函數;async

  3. 不須要像以前的例子那麼複雜,直接讓loop來處理;ide

  4. 像一個普通的生成器同樣yield值。異步編程


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

相關文章
相關標籤/搜索