Race condition (состояние гонки) возникает, когда два или более потока или процесса получают доступ к общим данным одновременно, и итоговый результат зависит от непредсказуемого порядка выполнения. Это приводит к несогласованности или повреждению данных.
Классический пример — два потока увеличивают один и тот же счётчик:
counter += 1 # Read, modify, write — не атомарна в Python
Хотя это выглядит как одна операция, она включает несколько шагов, которые могут быть прерваны в середине выполнения другим потоком.
threading.Lock) — самое распространённое решение; только один поток может захватить блокировку одновременно, остальные ждут её освобожденияthreading.RLock) — реентерабельная блокировка, которая позволяет одному и тому же потоку захватить её несколько раз без дедлокаthreading.Semaphore) — контролирует доступ, ограничивая количество потоков, которые могут одновременно входить в критическую секциюqueue.Queue в Python потокобезопасен по умолчанию и идеален для паттерна producer-consumerimport threading
lock = threading.Lock()
counter = 0
def increment():
global counter
with lock:
counter += 1
GIL (Global Interpreter Lock) в CPython обеспечивает некоторую защиту для простых операций, но это не замена явной синхронизации. Всегда используй правильные механизмы блокировки, когда несколько потоков читают и записывают общее изменяемое состояние.
Condition гонки возникает, когда несколько потоков одновременно обращаются к общим данным, и результат выполнения непредсказуем, так как зависит от порядка выполнения потоков.
Новый — ещё не проверен сообществом
Вы