Python包 - aiohttp有一条警告消息“Unclosed client session”

时间:2017-09-08 09:14:10

标签: python python-asyncio 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()

当我运行我的代码时,它会显示一条警告消息: 未公开的客户会话

任何人都可以给我一些解决方案吗?

非常感谢

3 个答案:

答案 0 :(得分:7)

您应该最后关闭连接。 您有两个选择:

您可以手动关闭连接:

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))
  

客户端会话支持自动关闭的上下文管理器协议。

答案 1 :(得分:6)

如果您没有使用上下文管理器,则关闭它的正确方法也需要使用await。互联网上有很多答案都错过了这一部分,实际上很少有人注意到它,大概是因为大多数人都使用了更方便的上下文管理器。但是,当/如果您在进行await session.close()处理时在tearDownClass()内部关闭全班级会话时,手册unittest是必不可少的。

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

答案 2 :(得分:1)

您应该使用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