我试图使用Asyncio和aiohttp库发出一系列请求(~1000),但我遇到了一个无法找到太多相关信息的问题.

当我用10个URL运行这段代码时,它运行得很好.当我使用RuntimeError: Event loop is closed多个URL运行它时,它会中断,并给出RuntimeError: Event loop is closed个错误.

import asyncio
import aiohttp


@asyncio.coroutine
def get_status(url):
    code = '000'
    try:
        res = yield from asyncio.wait_for(aiohttp.request('GET', url), 4)
        code = res.status
        res.close()
    except Exception as e:
        print(e)
    print(code)


if __name__ == "__main__":
    urls = ['https://google.com/'] * 100
    coros = [asyncio.Task(get_status(url)) for url in urls]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(coros))
    loop.close()

堆栈跟踪可以在here处找到.

任何帮助或见解都将不胜感激,因为我已经为此绞尽脑汁几个小时了.显然,这意味着一个事件循环已经关闭,应该仍然是开放的,但我不认为这是可能的.

推荐答案

你说得对,loop.getaddrinfo使用ThreadPoolExecutor在一个线程中运行socket.getaddrinfo.

你用的是带超时的asyncio.wait_for,这意味着res = yield from asyncio.wait_for...将在4秒后提高asyncio.TimeoutError.然后get_status个协同路由返回None,循环停止.如果作业(job)在此之后完成,它将try 在事件循环中安排回调,并引发异常,因为它已经关闭.

Python-3.x相关问答推荐

为什么vs code返回错误—LocaleError:int对象没有属性where,但相同的代码运行在Google Colab上没有任何问题''''

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

在Pandas 数据帧中为小于5位的邮政编码添加前导零

检测点坐标 - opencv findContours()

Python 舍入数字不准确

如何创建与导航抽屉一起使用的导航栏

如何将日期时间索引写入日期类型的表?

提高时间复杂度的一些建议

裁剪复数以解决 exp 中的溢出错误

如果值超出上下限(异常值处理),则将值的数据框替换为 np.nan

Jupyter Notebook 拒绝打印一些字符串

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

python tkInter 浏览文件夹按钮

Python - 如何从同一台客户端机器运行多个Flask应用程序

Tkinter 窗口显示(无响应)但代码正在运行

谁能给我一个 Python 3 中标准输入和标准输出的快速教程?

是否可以在每个路由的基础上限制 Flask POST 数据大小?

使用 Python 3 读取 CSV 文件

在 PyCharm 中配置解释器:请使用不同的 SDK 名称

TypeError:无法将系列转换为