как сделать переподключение в случае потери соединения? Aiohttp
У меня есть такой код:
async def find_product_by_id(number_of_requests):
global amount_r
async with aiohttp.ClientSession() as session:
tasks = [] #собирает все запросы тут
for i in range(number_of_requests):
print(amount_r)
amount_r = amount_r + 1
tasks.append(asyncio.create_task(session.get(url = f'https://api.kazanexpress.ru/api/v2/product/{amount_r}'))) # Добавления новой задачи
responses = await asyncio.gather(*tasks) # Асиннхронная активация всех собранных задач
yield [await r.text(encoding='UTF-8') for r in responses] # возвращяет один ответ за раз
Вот что я получаю на 5 тысячный запрос
Traceback (most recent call last):
File "c:\проекты\kazanexpress_parser\main.py", line 154, in <module>
loop.run_until_complete(main())
File "C:\Users\batu\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 642, in run_until_complete
return future.result()
File "c:\проекты\kazanexpress_parser\main.py", line 129, in main
async for i in find_product_by_id(N):
File "c:\проекты\kazanexpress_parser\main.py", line 29, in find_product_by_id
responses = await asyncio.gather(*tasks) # Асиннхронная активация всех собранных задач
File "C:\Users\batu\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\client.py", line 1125, in throw
self._coro.throw(arg)
File "C:\Users\batu\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\client.py", line 559, in _request
await resp.start(conn)
File "C:\Users\batu\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\client_reqrep.py", line 898, in start
message, payload = await protocol.read() # type: ignore[union-attr]
File "C:\Users\batu\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\streams.py", line 616, in read
await self._waiter
aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected
существует ли способ востоновить соединение и продолжить функцию с того же момента где она получила ошибку?
на всякий случай вот мой main:
async def main():
# последовательная активация функций
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
N = 1000 # Количество запросов подряд
#p = Process(target=find_product_by_id_2_proc)
#p.start()
itr = 10 # Количество итераций
parse_thread = threading.Thread(target= parse_product)
parse_thread.start()
start_timestamp = time.time()
for i in range(itr): # количество итераций, Одна итерация == N запросов
async for i in find_product_by_id(N):
row_data.append(i)
print('Количество продуктов: ',len(data))
time.sleep(5)
print('sleep time')
task_time = round(time.time() - start_timestamp, 2)
rps = round(N / task_time, 1)
print(
f"| Requests: {N *itr}; Total time: {task_time} s; RPS: {rps}. |\n"
)
with open('file','w',encoding='UTF-8') as f:
for i in data:
f.write(str(i))
f.write(' ')
if __name__ == '__main__':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()