J'ai plusieurs méthodes différentes qui ne sont pas censées s'exécuter simultanément, donc j'utilise un verrou unique pour les synchroniser. Cela ressemble à ceci :
selected_method = choose_method()
with lock:
selected_method()
Dans certaines de ces méthodes, il m'arrive parfois d'appeler une fonction d'aide qui effectue des entrées-sorties réseau lentes. (Appelons-la network_method()
). Je voudrais libérer le verrou pendant que cette fonction s'exécute, pour permettre aux autres threads de continuer leur traitement.
Une façon d'y parvenir serait d'appeler lock.release() et lock.acquire() avant et après l'appel de la méthode réseau. Cependant, je préférerais que les méthodes ne soient pas conscientes du verrou, car il y en a beaucoup et elles changent tout le temps.
Je préférerais beaucoup réécrire network_method()
pour qu'elle vérifie si le verrou est détenu, et si c'est le cas, le libérer avant de commencer et le reprendre à la fin.
Remarquez que network_method()
est parfois appelée depuis d'autres endroits, donc elle ne devrait pas libérer le verrou si ce n'est pas sur le thread qui le détient.
J'ai essayé d'utiliser la méthode locked()
sur l'objet Lock, mais cette méthode ne me dit que si le verrou est détenu, pas s'il est détenu par le thread actuel.
Par ailleurs, le verrou est un objet global et cela me convient.