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