La question est un peu floue. Vous devez soit utiliser des sémaphores au lieu de verrous ou vérifier si le verrou est verrouillé.
Les verrous Python ne sont pas identiques aux verrous sur .Net, par exemple. Le verrou de Python déverrouille une fois tous les autres threads acquis() sur le même verrou et bloqués pour le moment. Tout fil peut se libérer et tous vont en même temps. Ainsi, au lieu de faire deuxième relase, faire
if l.locked():
l.release()
Si vous voulez le comportement « de la file d'attente », où une seule bande de roulement sera propriétaire d'une serrure une fois d'autres versions, utilisez Sémaphore, événement ou d'une autre classe similaire qui permet comportement de verrouillage et de mise en file d'attente imbriqué. Il est intéressant de noter que d'autres langages/loolkits, comme .Net, verrouillent nativement la mise en file d'attente, où les threads peuvent empiler lock.acquire dans l'ordre, bloquer et s'approprier l'objet lock dans l'ordre de la file d'acquisition, non relâchez tout à la fois.
(Edit: oublié de mettre les parents comme dans "si l.locked: l.realse()". Corrigé le code Lock.locked est confirmé comme étant une méthode présente dans cPython 2.6.x, 3.x, IronPython 2.6.1)
Normalement, vous écririez simplement votre code pour qu'il n'essaie pas de libérer un verrou plus de fois qu'il n'est acquis ... – Amber
Cela pourrait inclure l'utilisation d'un drapeau is_the_lock_locked? –