Maison >développement back-end >Golang >Comment pouvez-vous implémenter un verrouillage limité dans le temps dans Go ?

Comment pouvez-vous implémenter un verrouillage limité dans le temps dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 04:22:02687parcourir

How can you implement a time-bound lock in Go?

Tentative d'acquisition d'un verrou limité dans le temps dans Go

Dans Go, le sync.Mutex intégré fournit uniquement le Lock() et les méthodes Unlock(). Cependant, il existe des scénarios dans lesquels il serait avantageux de pouvoir tenter d'acquérir un verrou avec une date limite, soit en abandonnant immédiatement, soit en respectant une date limite.

Énoncé du problème

Considérez les scénarios suivants :

  • Service RPC sensible à la latence :A Le service gourmand en CPU reçoit des requêtes urgentes. L'acquisition d'un verrou après la date limite de la demande entraînerait un gaspillage de ressources et des performances sous-optimales.
  • Mise à jour des statistiques d'objet : Un groupe d'objets doit être mis à jour dans un délai précis. Tenter de toucher des objets verrouillés ne doit pas dépasser le délai imparti.

Solution : Mutex basé sur le canal

Une solution simple pour réaliser l'acquisition du verrou avec un délai est pour utiliser un canal avec une taille de tampon de un comme mutex.

Mise en œuvre

<code class="go">l := make(chan struct{}, 1)

// Lock: send a struct to the channel
l <- struct{}{}

// Unlock: receive a struct from the channel
<-l</code>

Essayer le verrouillage

Pour essayer d'acquérir le verrou, utilisez le code suivant :

<code class="go">select {
case l <- struct{}{}:
    // Lock acquired
    defer <-l
default:
    // Lock not acquired
}</code>

Essayez avec Timeout

Pour essayer d'acquérir le verrou avec un timeout, utilisez :

<code class="go">select {
case l <- struct{}{}:
    // Lock acquired
    defer <-l
case <-time.After(time.Minute):
    // Lock not acquired
}</code>

Conclusion

En utilisant une approche basée sur les canaux , il est possible d'implémenter un verrou prenant en charge les tentatives d'acquisition avec délais d'attente dans Go, offrant une plus grande flexibilité dans la gestion des scénarios de verrouillage avec des contraintes de temps.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn