Неожиданное завершение работы цикла асинхронной функции
Написал код с использованием асинхронной функции, но после нескольких минут он завершает свой цикл, хотя не должен.
Пишу код для вытягивания расписания всех факультетов и столкнулся с такой проблемой. Возможно ли, что ошибка в большом количестве итераций (в одном факультете примерно 4000 записей) Вот сообщение, которое выходит:
File "/home/sgtu_bot/microservice/main.py", line 88, in <module>
asyncio.run(main())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/home/sgtu_bot/microservice/main.py", line 76, in main
schedule = await get_schedule(group['ID'], week_number)
File "/home/sgtu_bot/microservice/main.py", line 24, in get_schedule
async with session.get(
File "/usr/local/lib/python3.10/dist-packages/aiohttp/client.py", line 1141, in __aenter__
self._resp = await self._coro
File "/usr/local/lib/python3.10/dist-packages/aiohttp/client.py", line 560, in _request
await resp.start(conn)
File "/usr/local/lib/python3.10/dist-packages/aiohttp/client_reqrep.py", line 894, in start
with self._timer:
File "/usr/local/lib/python3.10/dist-packages/aiohttp/helpers.py", line 720, in __exit__
raise asyncio.TimeoutError from None
asyncio.exceptions.TimeoutError
Буду признателен за помощь. Сам код:
async with conn_pool.acquire() as conn:
for number in numbers:
current_number = number
#for faculty in faculties.keys():
for course in range(1, 7):
groups = await get_groups(current_number, course)
for group in groups:
for week_number in range(1, 49):
schedule = await get_schedule(group['ID'], week_number)
if len(schedule) != 0:
for dictionary in schedule:
async with conn.transaction():
await insert_schedule(conn, dictionary, i)
i += 1
await conn_pool.close()
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Смотрите стек вызовов. Тут явно аиохттп сваливается по таймауту (скорее всего сервер не отвечает на такое количество запросов ). Вам нужно поставить работу с внешкой в блоки try except и обернуть в while. Также стоит поставить какие-нибудь задержки для повторного запроса.