Почему асинхронный HTTP сервис более оптимизирован с точки зрения ресурсов по сравнению с многопоточным
Что проверяют
Понимаете ли вы, на чём конкретно экономит асинхронный сервис, и знаете ли границу, где экономия исчезает. Ответ «асинхронность быстрее» не засчитывают: ждут слов про задачи, ограниченные вводом-выводом, и про цену одного соединения.
Как отвечать
Сравнивать надо стоимость одного одновременного соединения:
- поток: собственный стек размером в мегабайты виртуальной памяти, объект в ядре, переключение контекста через ядро. Тысячи потоков означают, что планировщик заметную часть времени занят самим собой;
- корутина: объект в куче на килобайты, переключение это возврат управления в цикл событий внутри процесса, без системного вызова. Один цикл поверх
epollдержит десятки тысяч сокетов.
Отдельно про Python: глобальная блокировка интерпретатора не даёт потокам считать параллельно, поэтому за многопоточность вы платите накладными расходами, не получая выигрыша на процессоре. На ожидании сети блокировка отпускается, так что потоки работают, просто дороже.
Границы, которые сильный кандидат называет сам:
- выигрыш есть на вводе-выводе: прокси, агрегация чужих API, вебсокеты, долгие соединения. На расчётах его нет;
- одна блокирующая строка внутри корутины, синхронный драйвер базы или
time.sleep, останавливает весь цикл и все соединения разом. В потоках такая ошибка стоит одного запроса; - расчёты выносят в пул процессов, а по ядрам масштабируются процессами-воркерами.
Где спотыкаются
Говорят про параллелизм. Асинхронность это конкурентность в одном потоке, она перекладывает ожидание, а не ускоряет вычисления, и на подсчёте хешей или разборе большого документа не даст ничего.
Смешивают в асинхронном коде блокирующие вызовы: синхронный HTTP-клиент, драйвер без поддержки корутин, чтение файла напрямую. Нужны асинхронные клиенты или вынос вызова в отдельный поток.
Отвечают теорией без профиля нагрузки. Если запросов десятки в секунду и упирается всё в базу, переход на асинхронный стек не даст ничего, зато усложнит отладку и трассировку.