如何将此函数转换为异步生成器

达米安·格赞卡(Damian Grzanka)

我正在尝试构建一个异步生成器,但是我找不到任何资源或想办法。

我仍然遇到相同的错误

TypeError:'async for'要求使用aiter方法的对象,得到协程

我从2016年开始读到一段令人难以理解的鼓舞人心的话,我真的很困惑。

基本上我想做的是安排多个协程,当其中一个协程完成时,我会产生一个值,这样我就可以在结果出现后立即处理它,而不必等待每个结果。

但是我不知道这个原因,所以我决定假设协程将按照它们创建的顺序完成,但我仍然有很多问题

我正在寻找一些解决方案,要么产生一个协程,要么对第一个成品协程起反应

在此先感谢您提供的任何提示,资源,示例和解决方案:)

async def get_from_few_pages(
    self,
    max_pages: int = 0,
):
    pages = [
        asyncio.ensure_future(
            asyncio.get_running_loop().create_task(self.extract_data_from_page(i))
        )
        for i in range(max_pages)
    ]

    for coroutine in pages:
        await asyncio.gather(coroutine)
        yield coroutine.result()
用户名

要创建异步生成器,您需要创建一个async def带有yield内部代码的,就像您的代码一样。实际上,您的代码虽然不完美,但看起来确实应该可以正常工作,所以我不知道为什么会出现引用的错误。

但是,您的代码存在问题:

  • 它将始终按照给出的顺序生成协程,而不是按照它们完成的顺序生成协程,但它们并行运行。
  • 你不需要既ensure_future()create_task()create_task()就足够了
  • 您不必asyncio.gather()等待一件事情,这是因为当您同时有多个事情要等待时

要获得一个生成的等待生成的生成器,可以使用asyncio.wait(return_when=FIRST_COMPLETED),如下所示:

async def get_from_few_pages(self, max_pages):
    pending = [asyncio.create_task(self.extract_data_from_page(i))
               for i in range(max_pages)]
    while pending:
        done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
        for fut in done:
            yield fut.result()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将生成器模式转换为功能实现?

如何将文本转换为字节串生成器?

如何将生成器对象转换为列表?

如何声明异步生成器函数

如何将Python数据生成器转换为Tensorflow张量?

如何将sql语句转换为typeorm查询生成器?

如何将流转换为生成器而不会泄漏诺言的解决方案

如何将简单的迭代器转换为JavaScript生成器

如何将此生成器函数转换为lambda表达式

如何将mysql查询转换为laravel查询生成器?

如何将基于回调的异步函数转换为异步生成器

将Observable转换为异步生成器

如何将通过TIME()函数过滤的mysql查询转换为laravel查询生成器?

如何将本机PHP转换为查询生成器Laravel?

Yii2如何将SUM SQL函数转换为查询生成器?

如何将在左联接内具有联接的SQL转换为查询生成器?

如何将此递归函数转换为迭代函数?

将函数转换为不带参数的生成器函数

将此sql语句转换为ORM或查询生成器

如何将此代码转换为异步等待?

我不知道如何将此查询转换为口才或流利的查询生成器

如何将mysql查询转换为laravel查询生成器

如何将此 JavaScript 递归函数转换为迭代函数?

将生成器转换为普通函数

将递归 Python 生成器函数转换为非生成器函数

如何将此迭代函数转换为递归函数?

如何将此 laravel 查询生成器用于此 SQL 查询

如何将此代码转换为函数?

请如何将此原始 sql 查询转换为 laravel eloquent 或查询生成器?