@everlest

Python — aiohttp, Отлавливать обрыв сессии, timeout = None?

У меня есть задача скачать видео с видеорегистраторов по их API . Timeout = None, поскольку загрузка видео может занять более 24 часов. API не умеет обрабатывать обрывы сети - ставится задача рег выплевывает видео .

Но если сервер, с которого я скачиваю, отключается, код зависает, потому что timeout = None. Как поймать этот обрыв ??

Существует идея . При помощи планировщика назначить задачу которая будет пинговать сервер , и как только пинг не идет она должна завершать задачу загрузки , и как появится связь восстанавливать задачу загрузки с того же момента . Но как осуществить *? APScheduler не позволяет внутри своей задачи отменять задачи созданные asyncio .

async with session.get(url,timeout=None) as response_get:
    with open('filename.ext', 'wb') as f:
        while True:
            chunk = await response_get.read(16144)  
            if not chunk: 
            break
           f.write(chunk)


import asyncio
import aiohttp
from aio_ping import ping

download_cancel = asyncio.Event()

async def is_network_available():
    result = ping ( host)
    return result

async def download_file(url, filename, network_available):
    while True:
        await network_available.wait()  

        if download_cancel.is_set():
            print
            return

async def main():
    network_available = asyncio.Event()
    network_task = asyncio.create_task(is_network_available(network_available))
    download_task = asyncio.create_task(download_file('https://example.com/large_file.zip', 'large_file.zip', network_available))

    await asyncio.gather(network_task, download_task)


if __name__ == "__main__":
    asyncio.run(main())
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
https://docs.aiohttp.org/en/stable/client_quicksta... там же куча разных таймаутов, подбери нужный, возможно это sock_read
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы