Этот вопрос проверяет понимание синхронизации потоков и безопасной работы с общими ресурсами.
Lock — это простая блокировка, которую поток может захватить только один раз. RLock — это рекурсивная блокировка, позволяющая одному и тому же потоку захватывать её несколько раз. Lock проще и быстрее, но менее гибкий. RLock нужен в сложных сценариях с вложенными вызовами. Оба используются для защиты общих данных.
При работе с потоками важно предотвращать одновременный доступ к общим данным.
Определение:Lock — это примитив синхронизации, который позволяет только одному потоку войти в критическую секцию.
Особенности:
Захват возможен только один раз
Повторный захват приводит к deadlock
Минимальные накладные расходы
Пример:
from threading import Lock
lock = Lock()
with lock:
# критическая секция
pass
Определение:RLock (Reentrant Lock) — это блокировка, которую один поток может захватывать несколько раз.
Особенности:
Ведёт счёт захватов
Освобождается после соответствующего числа release
Подходит для вложенных вызовов
Пример:
from threading import RLock
lock = RLock()
def func():
with lock:
inner()
def inner():
with lock:
pass
Lock — один захват, RLock — несколько
RLock безопасен при рекурсии
Lock быстрее и проще
Вывод:
Используй Lock по умолчанию. Выбирай RLock, если функция может повторно захватывать одну и ту же блокировку.