我的代码如下:
import asyncio
import aiohttp
urls = [
'http://www.163.com/',
'http://www.sina.com.cn/',
]
async def get_url_data(u):
resp = await aiohttp.ClientSession().get(url=u)
headers = resp.headers
return headers
async def request_url(u):
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()
当我运行代码时,它会显示一条警告消息:
Unclosed client session
有人可以给我一些解决方案吗?
最后应该关闭连接。 您有 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))
客户端会话支持上下文管理器协议以自动关闭。
如果您不使用上下文管理器,关闭它的正确方法还需要一个
await
。互联网上的许多答案都忽略了这一部分,并且很少有人真正注意到它,大概是因为大多数人使用更方便的上下文管理器。但是,当/如果您在进行 await session.close()
ing 时要关闭 tearDownClass()
内的全班课程时,手册 unittest
是必不可少的。
import aiohttp
session = aiohttp.ClientSession()
# use the session here
await session.close()
您应该使用
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