python-3.x - TypeError:“list_iterator”对象不是异步可迭代的
问题描述
我有一个同步工作的简单 python3 webscraper。我想让它异步,所以我稍微修改了一下。[(,), (,), (,), ...]
但是,即使在使用 iter() 将其转换为可迭代列表后,该程序也不会迭代解压列表。说TypeError: 'list_iterator' object is not async iterable
。
因为我的代码很大,而且我还在学习异步编程,所以我将主要部分与错误一起放在这里。
我的目标是异步获取链接以加快进程。有没有办法解决这个问题?
代码 :
import requests as req
from bs4 import BeautifulSoup as bs
import os
import asyncio
from aiostream import stream, pipe
myList = []
def get_myList():
"""
Append values to myList in the format [(,), (,), (,), ...]
"""
async def download(link, title):
# Download a page
try:
page = await req.get(link)
# Process with BeautifulSoup
pass
except:
pass
async def main():
get_myList()
min_iterList = iter(myList[:])
stream.starmap(min_iterList, download, ordered=True, task_limit=10)
if __name__=="__main__":
freeze_support()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
错误 :
Traceback (most recent call last):
File "async_update_code.py", line 253, in <module>
loop.run_until_complete(main())
File "/usr/lib/python3.6/asyncio/base_events.py", line 468, in run_until_complete
return future.result()
File "async_update_code.py", line 207, in main
stream.starmap(min_iterList, download, ordered=True, task_limit=10)
File "/home/yahyaa/.local/lib/python3.6/site-packages/aiostream/core.py", line 273, in init
assert_async_iterable(args[0])
File "/home/yahyaa/.local/lib/python3.6/site-packages/aiostream/aiter_utils.py", line 56, in assert_async_iterable
f"{type(obj).__name__!r} object is not async iterable")
TypeError: 'list_iterator' object is not async iterable
解决方案
除了尝试在普通迭代器上进行异步迭代(您已解决)的问题之外,还有一个更深层次的问题是您没有使用异步 http 库。
例如,您不能因为不返回 asyncio 未来await
的结果,而是返回一个. 删除会使错误消失,但最终会得到普通的同步代码。为了加快并行运行多个下载,您需要:requests.get
requests.get()
Response
await
切换
requests
到异步 http 库,例如优秀的aiohttp
用于
asyncio.gather
等待并行运行的下载,如这里所示
aiostream
为此目的可能有点过分 - 它专门处理异步迭代器。(异步迭代器是类似迭代器的对象,它__next__
被调用__anext__
并且是一个协程。一个典型的用例是一个数据库 API,它为结果行提供异步迭代器。它们使用 进行迭代async for
,但aiostream
在异步迭代器上提供了广泛的运算符,涵盖创建、转换、选择、聚合等。)
推荐阅读
- javascript - 在 Summernote 中创建自定义按钮插件
- javascript - 保存菜单当前位置
- c# - 使用流时的 C# System.UnauthorizedAccessException
- database - Access 2016 中药剂师与患者的关系
- javascript - 在javascript中使图像移动适应窗口大小
- python - Django url模板标签添加绝对文件路径
- laravel - 集合查询生成器 - orderBy 多个值
- java - 在 Button Click 上打开一个片段会引发 InflateException?
- angular - Firebase 和外部 API 404(firebase 函数)
- javascript - 如何从 Firebase 实时数据库中删除数据(使用 prevChildKey)?