Выбор ответа Middle GIL, потоки и процессы спрашивают часто обновлено

Выбор между потоками, процессами и asyncio

Вопрос

Сервис должен держать 10 000 одновременных WebSocket-соединений, почти всё время ожидая сообщений. Что подходит лучше всего?

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

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

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

Коротко

Правильный ответ: asyncio: один цикл дёшево держит тысячи ожидающих сокетов. Задача чисто I/O-bound с огромным числом ожиданий.

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

  1. asyncio: один цикл дёшево держит тысячи ожидающих сокетовправильный ответ
  2. 10 000 потоков, по одному на соединение, GIL отпустится на I/O
  3. 10 000 процессов, чтобы обойти GIL
  4. ProcessPoolExecutor с 4 воркерами на все соединения

Разбор

Задача чисто I/O-bound с огромным числом ожиданий. Корутина стоит килобайты, а поток мегабайты стека и переключения ядра ОС, поэтому 10 000 потоков тяжело, а процессов тем более. Пул из 4 процессов вообще не держит 10 000 соединений одновременно. asyncio (или фреймворк на нём) это стандартный выбор.

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

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