Ни один не “лучше” всегда. Multithreading и multiprocessing решают разные задачи. Выбор зависит от CPU-нагрузки, работы с памятью и архитектуры программы.
Разберём системно.
| Multithreading | Multiprocessing | |
|---|---|---|
| Память | общая | отдельная |
| Скорость общения | очень быстро | медленнее |
| Изоляция | слабая | сильная |
| Crash | может уронить процесс | изолирован |
| Создание | дешёвое | дорогое |
Multithreading хорош, когда задачи:
- много ждут I/O
- мало используют CPU
Например:
- сетевые запросы
- загрузка файлов
- ожидание базы данных
- ожидание API
Пример:
download 1000 urls
Потоки могут параллельно ждать ответы.
Типичные примеры:
- web servers
- network programs
- GUI программы
Многие серверы используют threads + event loop.
Multiprocessing лучше для CPU-тяжёлых задач.
Например:
- машинное обучение
- обработка изображений
- видео
- криптография
- научные расчёты
Почему?
Каждый процесс может использовать отдельное CPU ядро.
Core1 → Process1
Core2 → Process2
Core3 → Process3
Главная причина — shared memory.
Threads видят одну и ту же память.
Пример:
shared cache
shared objects
shared state
Не нужно сериализовать данные.
В multiprocessing нужно:
IPC
pipes
queues
serialization
Это медленнее.
Историческая причина — безопасность и стабильность.
Если поток падает:
segmentation fault
он может убить весь процесс.
Если падает процесс:
worker died
его можно перезапустить.
Поэтому:
- nginx → процессы
- php-fpm → процессы
- gunicorn → процессы
master
├ worker
├ worker
├ worker
Каждый worker — процесс.
Это multiprocessing.