码迷,mamicode.com
首页 > 其他好文 > 详细

深入Asyncio(九)异步生成器

时间:2018-10-22 11:35:31      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:generator   run   ado   答案   不同   UNC   proc   eve   rop   

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())
  1. 几乎一样,只是改了个名字;

  2. 现在用async def声明函数,并且函数内使用了yield,则可以将其认定为异步生成器函数;

  3. 不需要像之前的例子那么复杂,直接让loop来处理;

  4. 像一个普通的生成器一样yield值。


就像普通生成器让代码更简短,在异步编程中异步生成器也具有相同的优点,可能对于初学者来说还有些复杂,但是多练习一下就会适应了。

深入Asyncio(九)异步生成器

标签:generator   run   ado   答案   不同   UNC   proc   eve   rop   

原文地址:https://www.cnblogs.com/ikct2017/p/9829040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!