Назад к вопросам
Junior
72
questionbank

Что такое конкурентность?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Конкурентность — это возможность системы одновременно обрабатывать несколько задач, достигая эффективности и отзывчивости. В Python достигается с помощью потоков (threads) и процессов (processes).

Основные подходы:

  1. Многопоточность (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')
    
  2. Многопроцессорность (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')
    
  3. Асинхронное программирование (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) и требований к параллелизму.