首页 > 解决方案 > 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

标签: python-3.xweb-scrapingpython-asyncio

解决方案


除了尝试在普通迭代器上进行异步迭代(您已解决)的问题之外,还有一个更深层次的问题是您没有使用异步 http 库。

例如,您不能因为不返回 asyncio 未来await的结果,而是返回一个. 删除会使错误消失,但最终会得到普通的同步代码。为了加快并行运行多个下载,您需要:requests.getrequests.get()Responseawait

aiostream为此目的可能有点过分 - 它专门处理异步迭代器。(异步迭代器是类似迭代器的对象,它__next__被调用__anext__并且是一个协程。一个典型的用例是一个数据库 API,它为结果行提供异步迭代器。它们使用 进行迭代async for,但aiostream在异步迭代器上提供了广泛的运算符,涵盖创建、转换、选择、聚合等。)


推荐阅读