通常,您应该只进行
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,并且可能在以后产生问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)