> Что такое синхронность, многопоточность и многопроцессорность (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.
Пример кода
PYTHONimport threadingimport multiprocessingimport 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 - это конкурентность, а не параллелизм.
> Похожие задачи по Python
В чем разница функции и процедуры
Что такое RabbitMQ dead letter exchange
Что такое duck typing и динамическая типизация в Python
Что такое mock и для чего он используется
> Похожие задачи по backend
В чем разница функции и процедуры
Что такое RabbitMQ dead letter exchange
Что такое duck typing и динамическая типизация в Python
Что такое mock и для чего он используется
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью