Назад к вопросам
Junior
67
questionbank
Что такое параллелизм?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Параллелизм - это способность системы выполнять несколько задач или процессов одновременно. В отличие от конкурентности, где задачи могут переключаться, создавая иллюзию одновременности (например, на одноядерном процессоре), параллелизм требует наличия нескольких физических ресурсов (например, ядер процессора).
Основные виды параллелизма:
- На уровне битов: Увеличение размера машинного слова (например, переход от 32-битных процессоров к 64-битным).
- На уровне инструкций: Исполнение нескольких инструкций в одном такте (например, конвейеризация, суперскалярная архитектура).
- На уровне данных: Применение одной операции к множеству элементов данных одновременно (например, SIMD-инструкции).
- На уровне задач (или потоков/процессов): Выполнение независимых блоков кода (задач) на нескольких ядрах или процессорах.
В контексте Python реализация параллелизма на уровне задач осуществляется преимущественно двумя способами:
- Многопроцессность (
multiprocessing): Создание независимых процессов, каждый со своим собственным адресным пространством и интерпретатором Python. Обмен данными между процессами требует явных механизмов (очереди, каналы, общая память). Это позволяет обойти ограничение Global Interpreter Lock (GIL) и использовать множество ядер CPU для ресурсоемких задач.// Пример использования multiprocessing import multiprocessing def worker(num): """Функция, выполняющая работу в отдельном процессе""" print(f'Worker {num} starting') import time time.sleep(1) print(f'Worker {num} finishing') if __name__ == '__main__': processes = [] for i in range(3): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() for p in processes: p.join() // Ожидание завершения процесса print('All processes finished') - Многопоточность (
threading): Создание потоков внутри одного процесса. Потоки имеют общее адресное пространство, что облегчает обмен данными, но ограничены GIL в cPython, который не позволяет одновременно выполнять Python-код множества потоков на разных ядрах. Многопоточность полезна для задач ввода-вывода (сеть, дисковые операции), где потоки могут переключаться, пока один из них ожидает.// Пример использования threading import threading def worker(num): """Функция, выполняющая работу в отдельном потоке""" print(f'Thread {num} starting') import time time.sleep(1) print(f'Thread {num} finishing') threads = [] for i in range(3): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() for t in threads: t.join() // Ожидание завершения потока print('All threads finished')
Выбор между многопроцессностью и многопоточностью зависит от типа задачи: многопроцессность предпочтительна для CPU-связанных задач, многопоточность - для I/O-связанных.
Различия:
| Признак | Многопроцессность (multiprocessing) |
Многопоточность (threading) |
|---|---|---|
| Ресурс | Отдельный процесс | Поток внутри процесса |
| Адресное пространство | Своё | Общее |
| Обмен данными | Сложный (требует явных механизмов) | Простой (общее пространство) |
| GIL | Обходит (каждый процесс имеет свой GIL) | Ограничивает (общий GIL на процесс) |
| Использование CPU | Эффективно для CPU-bound задач | Неэффективно для CPU-bound задач |
| Создание | Дорогое (форк процесса) | Дешевое |
| Завершение | ОС завершает | Явное завершение или выход из функции |
| Ошибки | Не влияют на другие процессы | Могут повлиять на весь процесс |