Выбор ответа Middle GIL, потоки и процессы спрашивают часто обновлено
Выбор между потоками, процессами и asyncio
Вопрос
Сервис должен держать 10 000 одновременных WebSocket-соединений, почти всё время ожидая сообщений. Что подходит лучше всего?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: asyncio: один цикл дёшево держит тысячи ожидающих сокетов. Задача чисто I/O-bound с огромным числом ожиданий.
Варианты ответа
- asyncio: один цикл дёшево держит тысячи ожидающих сокетовправильный ответ
- 10 000 потоков, по одному на соединение, GIL отпустится на I/O
- 10 000 процессов, чтобы обойти GIL
ProcessPoolExecutorс 4 воркерами на все соединения
Разбор
Задача чисто I/O-bound с огромным числом ожиданий. Корутина стоит килобайты, а поток мегабайты стека и переключения ядра ОС, поэтому 10 000 потоков тяжело, а процессов тем более. Пул из 4 процессов вообще не держит 10 000 соединений одновременно. asyncio (или фреймворк на нём) это стандартный выбор.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.