Назад к вопросам
Middle
67
questionbank
Что такое параллелизм?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Параллелизм — это способность системы выполнять несколько задач одновременно или кажущимся одновременно. В Python это достигается с помощью модулей threading и multiprocessing.
Ключевые аспекты:
- Одновременное выполнение: Задачи выполняются в одно и то же время (в случае многопроцессности на многоядерных процессорах) или выполняются переключения между задачами настолько быстро, что создается иллюзия одновременности (в случае многопоточности).
- GIL (Global Interpreter Lock): В CPython GIL ограничивает фактическое параллельное выполнение потоков, использующих CPU-связанные операции. Для таких задач лучше использовать многопроцессность.
- Сценарии использования: Параллелизм полезен для задач, связанных с вводом/выводом (сеть, файловая система), где потоки могут ожидать завершения операций, и для CPU-связанных задач (вычисления), где процессы могут выполняться на разных ядрах.
Многопоточность (Threading):
Потоки разделяют одно и то же адресное пространство памяти.
import threading
import time
def worker(num):
"""Thread worker function"""
print(f'Worker: {num}')
time.sleep(1)
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,)) // Создание потока
threads.append(t)
t.start() // Запуск потока
for t in threads:
t.join() // Ожидание завершения потока
print('All threads finished.')
Многопроцессность (Multiprocessing):
Процессы имеют отдельное адресное пространство памяти.
import multiprocessing
import time
def worker(num):
"""Process worker function"""
print(f'Worker: {num}')
time.sleep(1)
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,)) // Создание процесса
processes.append(p)
p.start() // Запуск процесса
for p in processes:
p.join() // Ожидание завершения процесса
print('All processes finished.')
Различия между многопоточностью и многопроцессностью:
| Признак | Многопоточность (Threading) | Многопроцессность (Multiprocessing) |
|---|---|---|
| Адресное пространство | Общее | Отдельное |
| GIL | Влияет на CPU-связанные задачи в CPython | Не влияет, так как каждый процесс имеет свой GIL |
| Создание | Быстрее | Медленнее (создание нового процесса) |
| Общение | Через общие переменные (требуется синхронизация) | Через очереди, пайпы, менеджеры (более безопасно) |