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

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

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

通常,您应该只进行

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
,并且可能在以后产生问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5655174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存