I am totally new to async. I'm having trouble closing connections when trying to make async requests. Here is my code:
def async_aiohttp_get_all(self, urls):
"""
Performs asynchronous get requests
"""
async def get_all(urls):
async with aiohttp.ClientSession(connector_owner=False) as session:
async def fetch(url):
async with session.get(url) as response:
#return await response.json()
rtn = {"url": response.url,
"content": await response.text()}
return rtn
rslts = await asyncio.gather(*[
fetch(url) for url in urls
])
return rslts
# Call get_all as a sync function to be used in a sync context
return sync.async_to_sync(get_all)(urls)
I get this error:
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x0000024EE21F4890>, 10368.656), (<aiohttp.client_proto.ResponseHandler object at 0x0000024EE21F4770>, 10368.671), (<aiohttp.client_proto.ResponseHandler object at 0x0000024EE21F49B0>, 10368.687), (<aiohttp.client_proto.ResponseHandler object at 0x0000024EE21F4AD0>, 10368.75), (<aiohttp.client_proto.ResponseHandler object at 0x0000024EE2261D90>, 10369.078)]']
connector: <aiohttp.connector.TCPConnector object at 0x0000024EE280C260>
I thought the solution must be to add await session.close()
, which I tried on the line before return rslts
, but this didn't make any difference.
How can I fix it?
The with
keyword will gracefully close your client connection, so the problem could possibly be with connector_owner=False
. Remove it.
async with aiohttp.ClientSession() as session:
async def fetch(url):
async with session.get(url) as response:
# Return await response.json()
res = {"url": response.url,"content": await response.text()}
return res