Выбор ответа Middle asyncio обновлено

Ограничение числа одновременных запросов

Вопрос

Нужно скачать 10 000 URL, но не больше 20 запросов одновременно. Что правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: asyncio.Semaphore(20) и async with sem: вокруг запроса. Семафор пропускает не больше 20 задач в критическую секцию, остальные ждут на async with. gather без ограничения откроет тысячи соединений разом, и сервер или клиент начнут отказывать.

Варианты ответа

  1. asyncio.Semaphore(20) и async with sem: вокруг запросаправильный ответ
  2. asyncio.gather на все 10 000 корутин без ограничений
  3. asyncio.Lock() вокруг запроса в каждой из задач
  4. time.sleep(0.05) между созданием задач, чтобы растянуть

Разбор

Семафор пропускает не больше 20 задач в критическую секцию, остальные ждут на async with. gather без ограничения откроет тысячи соединений разом, и сервер или клиент начнут отказывать. Lock ограничит до одного запроса, то есть до последовательного выполнения. time.sleep вообще блокирует цикл.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.