Не так давно я начал учиться асинчо.И я столкнулся с проблемой.Мой код не заканчивается.Я не могу понять это.Помоги мне, пожалуйста!
import signal
import sys
import asyncio
import aiohttp
import json
loop = asyncio.get_event_loop()
client = aiohttp.ClientSession(loop=loop)
async def get_json(client, url):
async with client.get(url) as response:
assert response.status == 200
return await response.read()
async def get_reddit_cont(subreddit, client):
data1 = await get_json(client, 'https://www.reddit.com/r/' + subreddit + '/top.json?sort=top&t=day&limit=50')
jn = json.loads(data1.decode('utf-8'))
print('DONE:', subreddit)
def signal_handler(signal, frame):
loop.stop()
client.close()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
for key in {'python':1, 'programming':2, 'compsci':3}:
asyncio.ensure_future(get_reddit_cont(key, client))
loop.run_forever()
Результат:
DONE: compsci
DONE: programming
DONE: python
...
Я пытался что-то сделать, но результат был нестабильным.
future = []
for key in {'python':1, 'programming':2, 'compsci':3}:
future=asyncio.ensure_future(get_reddit_cont(key, client))
loop.run_until_complete(future)
Результат (1 задание вместо 3):
DONE: compsci
[Finished in 1.5s]
Я решил свой вопрос следующим образом:
Добавлено:
async with aiohttp.ClientSession () as a client:
AT:
async def get_reddit_cont (subreddit, client):
И:
if __name__ == '__main__':
loop = asyncio.get_event_loop()
futures = [get_reddit_cont(subreddit,client) for subreddit in range(1,6)]
result = loop.run_until_complete(asyncio.gather(*futures))
Но когда код завершен, я получаю сообщение:
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x034021F0>
[Finished in 1.0s]
Iне понимаю, почему это происходит.
Но когда я пытаюсь выполнить "для ключа" около 60 или более раз, я получаю ошибку:
...
aiohttp.client_exceptions.ClientOSError: [WinError10054] Удаленный хост принудительно прервал существующее соединение