У меня есть задача скачать видео с видеорегистраторов по их 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())