Пакет Python - aiohttp имеет предупреждающее сообщение "Незакрытая клиентская сессия"

Мой код выглядит следующим образом:

import asyncio
import aiohttp

urls = [
    'http://www.163.com/',
    'http://www.sina.com.cn/',
    'https://www.hupu.com/',
    'http://www.csdn.net/'
]

async def get_url_data(u):
    """
    read url data
    :param u:
    :return:
    """
    print('running ', u)
    resp = await aiohttp.ClientSession().get(url=u)
    headers = resp.headers
    print(u, headers)
    return headers

async def request_url(u):
    """
    main func
    :param u:
    :return:
    """
    res = await get_url_data(u)
    return res

loop = asyncio.get_event_loop()
task_lists = asyncio.wait([request_url(u) for u in urls])
loop.run_until_complete(task_lists)
loop.close()

Когда я запускаю свой код, он выдает предупреждение: Незакрытая клиентская сессия

Кто-нибудь может подсказать мне решение этой проблемы?

Большое спасибо

В конце концов, вы должны закрыть соединение. У вас есть 2 варианта:

Вы можете закрыть соединение вручную:

import aiohttp
session = aiohttp.ClientSession()
# use the session here
session.close()

Или вы можете использовать его с менеджером контексных соединений:

import aiohttp
import asyncio

async def fetch(client):
    async with client.get('http://python.org') as resp:
        assert resp.status == 200
        return await resp.text()

async def main(loop):
    async with aiohttp.ClientSession(loop=loop) as client:
        html = await fetch(client)
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))

Клиентская сессия поддерживает протокол контекстного менеджера для самозакрытия.

Комментарии (0)

Вы должны использовать ClientSession, используя асинхронный менеджер контекста для правильной блокировки/освобождения ресурсов:

async def get_url_data(u):
    """
    read url data
    :param u:
    :return:
    """
    print('running ', u)
    async with aiohttp.ClientSession() as session:
        resp = await session.get(url=u)
        headers = resp.headers
        print(u, headers)
        return headers
Комментарии (0)