Что такое параллелизм в программировании?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Параллелизм в программировании — это выполнение нескольких задач одновременно или кажущееся одновременным, что позволяет повысить производительность и отзывчивость приложений.
Различают несколько видов параллелизма:
-
Многопроцессность (Multiprocessing): Использует несколько независимых процессов, каждый со своим адресным пространством. Это обходит ограничение GIL (Global Interpreter Lock) в CPython и подходит для задач, интенсивно использующих CPU.
import multiprocessing import time def worker(num): """Некая работа""" time.sleep(1) print(f'Worker {num} finished') if __name__ == '__main__': 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 workers finished") -
Многопоточность (Multithreading): Использует несколько потоков в рамках одного процесса, разделяющих общее адресное пространство. Из-за GIL в CPython, потоки не выполняются параллельно на разных ядрах для CPU-bound задач, но эффективны для I/O-bound задач.
import threading import time def worker(num): """Некая работа""" time.sleep(1) # Имитация I/O операции print(f'Thread {num} finished') 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") -
Асинхронное программирование (Asyncio): Использует один поток и цикл событий (event loop) для управления выполнением задач. Подходит для высоконагруженных I/O-bound приложений и веб-серверов. Не блокирует выполнение при ожидании I/O.
import asyncio import time async def worker(num): """Некая асинхронная работа""" await asyncio.sleep(1) # Асинхронное ожидание I/O print(f'Async worker {num} finished') async def main(): tasks = [] for i in range(5): task = asyncio.create_task(worker(i)) tasks.append(task) await asyncio.gather(*tasks) print("All async workers finished") if __name__ == '__main__': asyncio.run(main())
Выбор подхода зависит от характера задачи:
| Подход | CPU-bound задачи | I/O-bound задачи | GIL | Использование памяти |
|---|---|---|---|---|
| Многопроцессность | Отлично | Хорошо | Обходит | Большое (свой процесс) |
| Многопоточность | Плохо (из-за GIL) | Отлично | Блокирует | Небольшое (общий процесс) |
| Асинхронность | Плохо | Отлично | Не блокирует | Небольшое (один поток) |
Параллелизм требует осторожного управления синхронизацией и ресурсами, чтобы избежать состояний гонки (race conditions) и взаимоблокировок (deadlocks).