Вопрос немного неясен. Вам нужно использовать семафоры вместо блокировок или проверить, заблокирован ли замок.
Замки Python не такие, как блокировки на .Net, например. Блокировка Python однажды разблокирует релизы ВСЕ другие потоки, которые приобрели() на одной и той же блокировке и заблокированы на данный момент. Любой поток может освобождаться, и все идет одновременно. Таким образом, вместо того, чтобы делать вторую разблокировку, выполните
if l.locked():
l.release()
Если вы хотите «очередь» поведение, где только один Протектор получит право собственности на замке сразу несколько других релизов, использовать семафор, событие или какой-либо другой подобный класс, который позволяет вложенные блокировки и поведение в очереди.
Интересно отметить, что другие языки/loolkits, такие как .Net, делают блокировку в очереди, где потоки могут накапливать блокировку.захвата по порядку, блокировать и владеть объектом блокировки в порядке очереди на покупку, а не отпустите все сразу.
(Изменить: забыли поставить родителей как в «если l.locked: l.realse()». Исправлен код. Lock.locked подтвержден как настоящий метод в cPython 2.6.x, 3.x, IronPython 2.6.1)
Как правило, вы просто пишете свой код, чтобы он не пытался освободить блокировку больше, чем она была получена ... – Amber
Это может включать использование флага is_the_lock_locked? –