Код: Выделить всё
urls = ['https://foo.bar/baz.jpeg', 'https://foo.bar/jaz.mp4', ...]
Когда я открываю браузер и введите один из ошибочных URL-адресов в адресную строку, для получения ошибки Not Found потребуется около 200 мс. Выполняя некоторые невинные вычисления, я ожидаю, что выполнение около 1000 вызовов займет не более 4 секунд, если они выполняются асинхронно.
Однако, используя этот код, который, как я полагаю, как-то уместно:
Код: Выделить всё
def async_check(urls):
async def fetch(session, url):
async with session.get(url) as response:
if response.status != 200:
return False
else:
return True
async def run(urls):
async with ClientSession() as session:
return await asyncio.gather(*[fetch(session, url) for url in urls])
return asyncio.get_event_loop().run_until_complete(run(urls))
Я считаю, что это связано с исправностью URL-адреса внутри списка, которые указывают на изображения и видео, загрузка которых в качестве объекта ответа может занять много времени, и в конечном итоге отнимает много времени для выполнения задачи.
Поразмыслив над тем, как я могу добиться проверки 404, я получил последовательность действий, которая выглядит примерно так:
Для каждого url, асинхронно получать его с помощью метода get, а также асинхронно спать в течение относительно длительного периода времени (скажем, 1 секунды). Когда сон закончится, попробуйте проверить, готов ли ответ, и, если да, добавьте в мой список ошибочных URL-адресов, если код состояния 404 (или отличается от 200). Если после сна ответ не «готов», я предполагаю, что это связано с загрузкой большого количества изображений или видео, и считаю его неисправным.
Поскольку верхний предел времени ожидания для каждого вызова составляет 1 секунду, я ожидаю, что для группы URL-адресов он будет работать относительно быстро.
Будет ли это считаться хорошим решением этой проблемы? или есть более разумный способ сделать это?
Подробнее здесь: https://stackoverflow.com/questions/636 ... p-requests