Acquérir des verrous avec des contraintes de temps à Golang
Lorsque vous travaillez avec des verrous à Golang, il existe des situations dans lesquelles vous devrez peut-être acquérir un verrou immédiatement ou respecter une certaine forme de délai. Alors que sync.Mutex de la bibliothèque standard ne fournit que les fonctions Lock() et Unlock(), il existe une technique qui permet d'émuler un verrou avec une date limite.
Implémentation d'un verrou avec une date limite
Implémentation d'un verrou avec une date limite
l := make(chan struct{}, 1)
Pour créer un verrou avec une date limite, vous pouvez utiliser un canal avec une taille de tampon de un :
l <- struct{}{}
Pour verrouiller, envoyez une valeur de structure au canal :
<-l
Pour déverrouiller, recevez de la chaîne :
Effectuer un verrouillage d'essai
select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }
Pour tenter un verrouillage d'essai, utilisez une instruction select :
Ce code permettra d'acquérir immédiatement le verrou s'il est disponible. Si le verrou est déjà maintenu, l'instruction select se bloquera jusqu'à ce que le verrou soit libéré.
Try Lock with Timeout
select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }
Pour spécifier un délai d'attente pour le verrou d'essai, ajoutez un canal time.After() à l'instruction select :
Ce code tentera d'acquérir le verrou pendant une minute maximum. Si le délai d'attente expire, l'instruction select se terminera et le verrou ne sera pas acquis.
Conclusion
Utilisation d'un canal avec une taille de tampon de un comme mutex vous permet d'implémenter un try lock avec une date limite. Cette technique peut être utile dans les scénarios où vous devez acquérir un verrou rapidement ou dans un délai précis.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!