Подтвердить что ты не робот

Является ли RLock разумным дефолтом по блокировке?

модуль потоковой передачи в Python предоставляет два вида блокировок: общий замок и блокировку реентера. Мне кажется, что, если мне нужен замок, я всегда должен предпочесть RLock над Lock; в основном для предотвращения ситуаций взаимоблокировки.

Кроме того, я вижу две точки, когда предпочитаю блокировку над RLock:

  • RLock имеет более сложную внутреннюю структуру и, следовательно, может иметь худшую производительность.
  • По какой-то причине я хочу предотвратить рекурсию потока через блокировку.

Я правильно ли рассуждаю? Можете ли вы указать на другие аспекты?

4b9b3361

Ответ 1

Две точки:

  • В официально выпущенных версиях Python (2.4, 2.5... до 3.1) RLock намного медленнее блокировки, поскольку Locks реализованы в C и RLocks в Python (это изменится в 3.2)
  • Блокировка может быть освобождена из любого потока (не обязательно поток, который приобретает() d), а RLock должен быть освобожден тем же потоком, который приобрел его

В нижней строке, я бы предложил использовать RLock, если он соответствует семантике, которую вы ищете, в противном случае придерживаться Locks по умолчанию.

Ответ 2

Обычно вы должны структурировать свой код таким образом, чтобы вам не приходилось рекурсивно блокировать при нормальной работе (в основном это заставляет вас использовать блокировки плотно вокруг защищенных структур данных, которые они защищают). Поэтому вы хотите поймать аномальную рекурсивную блокировку.