Какие основные примитивы синхронизации потоков существуют в Python

Ответ

В Python для синхронизации потоков в модуле threading существуют следующие основные примитивы:

  1. Lock (мьютекс) — базовый механизм блокировки. Гарантирует, что только один поток может исполнять критическую секцию кода в один момент времени. Попытка захватить заблокированный Lock остановит поток до его освобождения.

    import threading
    
    lock = threading.Lock()
    
    with lock:
        # Этот код выполнит только один поток одновременно
        print("Критическая секция")
  2. RLock (реентерабельная блокировка) — позволяет одному и тому же потоку захватывать блокировку несколько раз без возникновения взаимной блокировки (deadlock). Поток должен освободить RLock столько же раз, сколько он его захватил. Полезна в рекурсивных функциях.

  3. Semaphore (семафор) — ограничивает количество потоков, которые могут одновременно получить доступ к общему ресурсу. Работает как счетчик: каждый вызов acquire() уменьшает его, а release() — увеличивает.

    # Не более 3 потоков могут выполнять этот блок одновременно
    semaphore = threading.Semaphore(3)
    
    with semaphore:
        # Работа с ограниченным ресурсом
        pass
  4. Event (событие) — простой механизм для коммуникации между потоками. Один поток может сигнализировать о событии (event.set()), а другие могут его ожидать (event.wait()).

  5. Condition (условие) — более сложный механизм, который объединяет Lock с возможностью ожидания определенного условия. Потоки могут ждать (condition.wait()), пока другой поток не уведомит их (condition.notify()) об изменении состояния.

  6. Barrier (барьер) — синхронизирует выполнение группы потоков, заставляя их всех ждать в определенной точке, пока не соберутся все участники.

Для синхронизации между процессами используются аналогичные примитивы из модуля multiprocessing.