Requête de savoir si Python threading.Serrure est verrouillée ou non
J'ai un fil, je suis en cours d'exécution (code ci-dessous) qui lance un blocage de la sous-processus. Pour s'assurer que les autres threads ne lancez pas le même sous-processus, j'ai un verrou autour de cette subprocess.call
appel. Je veux aussi être capable de mettre fin à ce sous-processus d'appel, j'ai donc une fonction d'arrêt que j'appelle d'ailleurs. Dans le cas où le sous-processus est arrêté prématurément, je veux libérer le verrou, qui est ce que le code ci-dessous:
class SomeThread(threading.Thread):
def run(self):
aLock.acquire()
self.clip = subprocess.call([ 'mplayer', 'Avatar.h264'], stdin=subprocess.PIPE)
aLock.release()
def stop(self):
if self.clip != None and self.clip.poll() == True:
try:
self.clip.send_signal(signal.SIGINT)
except:
pass
aLock.release()
Cependant, d'après la documentation ici, appelant release()
sur un libéré de verrouillage va lever une Exception:
A RuntimeError is raised if this method is called when the lock is unlocked.
Est-il une fonction de requête comme aLock.isLocked()
?
OriginalL'auteur puk | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Sûr!
Vous pouvez également faire un non-bloquant acquérir:
Dans ce cas, si
x
a déverrouillé le code de l'acquiert, et la libère. Mais si x était déjà de verrouillage, le non-blocage acquérir renvoie à la fois (et retourneFalse
), et nous avons de nouveau le libérer. Mais qui est sujet à des courses! Il n'y a rien pour arrêter un autre thread de libérer le verrou entre ces deux lignes.Idem pour la vérification de
.locked()
. Que ne vous raconte pas l'état de la serrure à l'époque.locked()
a été exécuté. Il peut ne plus être vrai au moment où vous exécutez l'instruction suivante.Par la manière, le corps de
run()
est mieux écrite d'utilisation de la serrure comme un "gestionnaire de contexte", comme suit:La ne la
acquire()/release()
paire pour vous, et est beaucoup plus robuste contre les imprévus exceptions soulevées dans le corps de lawith
bloc (Python, tout est fait pour libérer le verrou si le corps est sorti pour tout raison).Eh bien, pourquoi ne pas la documentation parler de la
locked()
fonction?OriginalL'auteur Tim Peters