все Python 3threadingпонятие
threading.Lock
синхронизация
Примитив взаимного исключения (мьютекс). Гарантирует, что только один поток в момент времени выполняет защищённый блок кода.
Синтаксис
lock = threading.Lock()
lock.acquire() / lock.release()
with lock: ...
Lock нереентрантный: если тот же поток попытается захватить его второй раз, не отпустив первый (в рекурсии или во вложенном методе под тем же локом), он заблокирует сам себя навсегда — ровно для этого случая существует RLock. Всегда бери его через with lock:, иначе исключение внутри блока оставит лок незакрытым и остальные потоки повиснут.
Примеры
import threading
lock = threading.Lock()
counter = 0
def increment():
global counter
with lock: # автоматический release
counter += 1
threads = [threading.Thread(target=increment) for _ in range(100)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 100
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности