> Какие плюсы и минусы у многопоточности, многопроцессности и синхронности, и какие преимущества у асинхронного подхода над многопоточным (Python)

Уровень: middle · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: EXCORP, Медиа Майн

Стек: Python

> Пример ответа

Короткий ответ

Многопоточность даёт конкурентность в рамках одного процесса, но в Python упирается в GIL для CPU-bound задач. Многопроцессность обходит GIL ценой памяти и сложности IPC. Синхронность проста, но блокирует I/O. Асинхронность эффективна для I/O-bound сценариев: один поток обрабатывает тысячи соединений без переключения контекста и гонок, но требует event loop и не подходит для CPU-bound.

Подробное объяснение

Многопоточность - несколько потоков в одном процессе, разделяют память. Плюсы: общий доступ к данным без IPC, низкие накладные расходы на создание. Минусы: гонки данных, deadlock, в Python GIL ограничивает параллелизм для CPU-bound, переключение контекста стоит дорого при большом числе потоков.

Многопроцессность - отдельные процессы с изолированной памятью. Плюсы: полный параллелизм на многоядерных CPU, нет GIL, изоляция сбоев. Минусы: высокая стоимость создания, сложный обмен данными (pickle, shared memory), больше потребление RAM, сложнее отладка.

Синхронность - последовательное выполнение. Плюсы: предсказуемость, простота, отсутствие гонок. Минусы: блокировка на I/O, низкая пропускная способность, неэффективное использование CPU во время ожидания.

Асинхронность - один поток, event loop, кооперативная многозадачность. Преимущества над многопоточностью:

  • нет гонок данных и необходимости в блокировках (в рамках одного потока)
  • минимальные накладные расходы на переключение задач (не системный контекст, а корутина)
  • масштабируется до десятков тысяч соединений на один процесс
  • нет проблем с GIL, так как нет параллельного выполнения

Минусы асинхронности: сложность отладки, нельзя использовать блокирующие вызовы, CPU-bound задачи блокируют весь loop, стек вызовов менее нагляден.

На практике

Для backend на Python выбор зависит от типа нагрузки:

  • I/O-bound (HTTP, DB, сеть) - asyncio или многопоточность. asyncio предпочтительнее при большом числе соединений.
  • CPU-bound (расчёты, обработка изображений) - multiprocessing или вынос в отдельный сервис.
  • Смешанная нагрузка - комбинация: asyncio + отдельные процессы для тяжёлых задач.

В продакшене часто используют фреймворки: FastAPI (async), Django (sync, но можно async views). Для CPU-bound задач - celery с multiprocessing worker'ами.

Пример кода

PYTHON
import asyncio
import threading
import time
# Синхронно
def sync_io():
time.sleep(1)
return "done"
# Асинхронно
async def async_io():
await asyncio.sleep(1)
return "done"
# Многопоточность
def thread_io():
time.sleep(1)
return "done"
async def main():
# 10 задач асинхронно - ~1 сек
start = time.time()
await asyncio.gather(*[async_io() for _ in range(10)])
print(f"async: {time.time() - start:.2f}s")
# 10 задач в потоках - ~1 сек
start = time.time()
threads = [threading.Thread(target=thread_io) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(f"threads: {time.time() - start:.2f}s")
# 10 задач синхронно - ~10 сек
start = time.time()
for _ in range(10):
sync_io()
print(f"sync: {time.time() - start:.2f}s")
asyncio.run(main())

Как отвечать на собеседовании

Начни с чёткого разделения: I/O-bound vs CPU-bound. Подчеркни роль GIL в Python. Сравни по критериям: стоимость переключения, сложность синхронизации, масштабируемость. Для асинхронности обязательно упомяни event loop и кооперативность. Приведи конкретный пример из практики: почему выбрал asyncio для API-шлюза, а multiprocessing для обработки данных. Не углубляйся в детали реализации event loop, если не спрашивают.

Что проверяет интервьюер

  • понимание разницы между конкурентностью и параллелизмом
  • знание GIL и его последствий
  • умение выбирать инструмент под задачу
  • понимание ограничений asyncio (блокирующие вызовы, CPU-bound)
  • знание альтернатив: threads, processes, async

Типичные ошибки

  • утверждение, что asyncio ускоряет CPU-bound задачи
  • игнорирование GIL при обсуждении многопоточности
  • смешение понятий "параллельно" и "конкурентно"
  • забывают, что в asyncio нельзя использовать блокирующие библиотеки без обёрток
  • рекомендация многопоточности для CPU-bound без оговорки про GIL

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью