Ответ
В Python для синхронизации потоков в модуле threading
существуют следующие основные примитивы:
-
Lock
(мьютекс) — базовый механизм блокировки. Гарантирует, что только один поток может исполнять критическую секцию кода в один момент времени. Попытка захватить заблокированныйLock
остановит поток до его освобождения.import threading lock = threading.Lock() with lock: # Этот код выполнит только один поток одновременно print("Критическая секция")
-
RLock
(реентерабельная блокировка) — позволяет одному и тому же потоку захватывать блокировку несколько раз без возникновения взаимной блокировки (deadlock). Поток должен освободитьRLock
столько же раз, сколько он его захватил. Полезна в рекурсивных функциях. -
Semaphore
(семафор) — ограничивает количество потоков, которые могут одновременно получить доступ к общему ресурсу. Работает как счетчик: каждый вызовacquire()
уменьшает его, аrelease()
— увеличивает.# Не более 3 потоков могут выполнять этот блок одновременно semaphore = threading.Semaphore(3) with semaphore: # Работа с ограниченным ресурсом pass
-
Event
(событие) — простой механизм для коммуникации между потоками. Один поток может сигнализировать о событии (event.set()
), а другие могут его ожидать (event.wait()
). -
Condition
(условие) — более сложный механизм, который объединяетLock
с возможностью ожидания определенного условия. Потоки могут ждать (condition.wait()
), пока другой поток не уведомит их (condition.notify()
) об изменении состояния. -
Barrier
(барьер) — синхронизирует выполнение группы потоков, заставляя их всех ждать в определенной точке, пока не соберутся все участники.
Для синхронизации между процессами используются аналогичные примитивы из модуля multiprocessing
.