我正在尝试构建一个异步生成器,但是我找不到任何资源或想办法。
我仍然遇到相同的错误
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] 删除。
我来说两句