Параллелизм - это способность системы выполнять несколько задач или процессов одновременно. В отличие от конкурентности, где задачи могут переключаться, создавая иллюзию одновременности (например, на одноядерном процессоре), параллелизм требует наличия нескольких физических ресурсов (например, ядер процессора).
Основные виды параллелизма:
В контексте Python реализация параллелизма на уровне задач осуществляется преимущественно двумя способами:
multiprocessing): Создание независимых процессов, каждый со своим собственным адресным пространством и интерпретатором Python. Обмен данными между процессами требует явных механизмов (очереди, каналы, общая память). Это позволяет обойти ограничение Global Interpreter Lock (GIL) и использовать множество ядер CPU для ресурсоемких задач.
python
threading): Создание потоков внутри одного процесса. Потоки имеют общее адресное пространство, что облегчает обмен данными, но ограничены GIL в cPython, который не позволяет одновременно выполнять Python-код множества потоков на разных ядрах. Многопоточность полезна для задач ввода-вывода (сеть, дисковые операции), где потоки могут переключаться, пока один из них ожидает.
python
Выбор между многопроцессностью и многопоточностью зависит от типа задачи: многопроцессность предпочтительна для CPU-связанных задач, многопоточность - для I/O-связанных.
Различия:
| Признак | Многопроцессность (multiprocessing) | Многопоточность (threading) |
|---|---|---|
| Ресурс | Отдельный процесс | Поток внутри процесса |
| Адресное пространство | Своё | Общее |
| Обмен данными | Сложный (требует явных механизмов) | Простой (общее пространство) |
| GIL | Обходит (каждый процесс имеет свой GIL) | Ограничивает (общий GIL на процесс) |
| Использование CPU | Эффективно для CPU-bound задач | Неэффективно для CPU-bound задач |
| Создание | Дорогое (форк процесса) | Дешевое |
| Завершение | ОС завершает | Явное завершение или выход из функции |
| Ошибки | Не влияют на другие процессы | Могут повлиять на весь процесс |