> Что такое синхронность, многопоточность и многопроцессорность (Python)

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

Компании: MTS

Стек: Python

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

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

Синхронность - это последовательное выполнение задач, когда каждая следующая начинается только после завершения предыдущей. Многопоточность - это выполнение нескольких потоков в рамках одного процесса, которые делят память и могут работать параллельно или конкурентно. Многопроцессорность - это запуск нескольких независимых процессов, каждый со своей памятью, что позволяет использовать несколько ядер CPU. В Python из-за GIL многопоточность не даёт выигрыша для CPU-bound задач, поэтому для них используют multiprocessing.

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

Синхронный код - это базовый способ выполнения программ: инструкции идут друг за другом, блокируя поток до завершения операции. Это просто и предсказуемо, но неэффективно при ожидании I/O.

Многопоточность (threading) - несколько потоков в одном процессе. Потоки разделяют адресное пространство, поэтому обмен данными проще, но есть риски гонок данных и необходимости синхронизации (locks, semaphores). В CPython существует GIL (Global Interpreter Lock), который позволяет выполнять только один поток байткода за раз. Поэтому для CPU-bound задач threading не даёт ускорения, но для I/O-bound задач (сеть, диски) потоки полезны: пока один поток ждёт ответа, другой работает.

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

Важно различать параллелизм (одновременное выполнение на разных ядрах) и конкурентность (чередование задач на одном ядре). Многопоточность в Python даёт конкурентность, многопроцессорность - параллелизм.

На практике

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

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

В реальных backend-проектах чаще всего используется асинхронный подход (FastAPI, aiohttp) или многопоточные серверы (Gunicorn с worker-ами). Многопроцессорность применяется для фоновых задач, например, в Celery.

Пример кода

PYTHON
import threading
import multiprocessing
import time
# Синхронно
def sync_task():
time.sleep(1)
return "done"
start = time.time()
for _ in range(4):
sync_task()
print(f"Sync: {time.time() - start:.2f}s")
# Многопоточность (I/O-bound)
def thread_task():
time.sleep(1)
return "done"
threads = []
start = time.time()
for _ in range(4):
t = threading.Thread(target=thread_task)
t.start()
threads.append(t)
for t in threads:
t.join()
print(f"Threading: {time.time() - start:.2f}s")
# Многопроцессорность (CPU-bound)
def cpu_task(x):
return sum(i * i for i in range(x))
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
start = time.time()
pool.map(cpu_task, [10_000_000] * 4)
print(f"Multiprocessing: {time.time() - start:.2f}s")

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

Начните с чёткого определения каждого термина. Затем перейдите к сравнению, обязательно упомяните GIL и его влияние на многопоточность в Python. Приведите примеры задач, где каждый подход уместен. Если спросят про asyncio - скажите, что это конкурентность на одном потоке через event loop, и что это отдельная модель, отличная от threading.

Покажите понимание trade-off: многопоточность проще для обмена данными, но сложнее с синхронизацией; многопроцессорность надёжнее изолирована, но дороже. Для junior достаточно уверенно объяснить базовые концепции и привести простой пример.

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

Интервьюер оценивает:

  • понимание базовых концепций операционных систем (процесс, поток, память);
  • знание особенностей Python (GIL, asyncio);
  • умение выбирать инструмент под задачу (I/O vs CPU bound);
  • понимание разницы между конкурентностью и параллелизмом;
  • способность объяснить простыми словами сложные вещи.

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

  • Путать многопоточность и многопроцессорность, говоря, что это одно и то же.
  • Утверждать, что threading в Python ускоряет вычисления - это не так из-за GIL.
  • Не упоминать asyncio, хотя это ключевая альтернатива для I/O-bound задач в современном Python.
  • Говорить, что многопроцессорность всегда лучше - забывать про накладные расходы на создание процессов и обмен данными.
  • Использовать термин "параллельность" для описания threading в Python - это конкурентность, а не параллелизм.

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

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