python - 异步运行时错误 : Event Loop is Closed

标签 python python-3.x python-asyncio aiohttp

我正在尝试使用 Asyncio 和 aiohttp 库发出一堆请求(~1000),但我遇到了一个问题,我找不到太多相关信息。

当我用 10 个 url 运行这段代码时,它运行得很好。当我使用 100 多个 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 .

任何帮助或见解将不胜感激,因为我已经为此苦苦思索了几个小时。显然,这表明事件循环已关闭但仍应打开,但我不明白这怎么可能。

最佳答案

错误被归档为 https://github.com/python/asyncio/issues/258 请继续关注。

作为快速解决方法,我建议使用自定义执行器,例如

loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(5)
loop.set_default_executor(executor)

在完成你的程序之前请做

executor.shutdown(wait=True)
loop.close()

关于python - 异步运行时错误 : Event Loop is Closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598231/

相关文章:

Python删除firefox历史记录

python - Django 如何保存十进制值?

python - 异步 : RuntimeError this event loop is already running

python - 如何从由于超时而取消的 python asyncio 协程返回值

python - 如何停止使用 websockets.serve() 创建的 websocket 服务器?

python - 如何将 pip 安装到 ubuntu 容器中,同时将层保持在最低限度?

python - 更改默认的 Python 编码风格

python - 规范化 DataFrame 中的值

python - 在列表理解中进行分配

python - 如何将 numpy 日期时间列表作为列添加到 Pandas Dataframe 中?