Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-11-01 04:22:02
original
603 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!