Ответ
В 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.