栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以从事件循环中返回异步生成器数据?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以从事件循环中返回异步生成器数据?

通常,您应该只进行

collect_data
异步,并在整个过程中使用异步代码-这就是设计异步使用的方式。但是,如果由于某种原因这是不可行的,您 可以
通过应用一些粘合代码来手动迭代异步迭代器:

def iter_over_async(ait, loop):    ait = ait.__aiter__()    async def get_next():        try: obj = await ait.__anext__() return False, obj        except StopAsyncIteration: return True, None    while True:        done, obj = loop.run_until_complete(get_next())        if done: break        yield obj

上面的工作方式是通过提供一个异步闭包来保持使用

__anext__
magic方法从异步迭代器中检索值,并在对象到达时返回它们。
run_until_complete()
在普通同步生成器内部的循环中调用此异步关闭。(闭包实际上返回一对完成的指示器和实际对象,以避免
StopAsyncIteration
通过传播
run_until_complete
,这可能不受支持。)

设置好此位置后,您可以使您

execute_tasks
的异步生成器(
async def
通过
yield
)并使用以下方法对其进行迭代:

for chunk in iter_over_async(execute_tasks(urls), loop):    ...

请注意,这种方法与不兼容

asyncio.run
,并且可能在以后产生问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号