Wie erhalte ich eine Sperre mit Frist in Go?

Patricia Arquette
Freigeben: 2024-10-29 15:22:02
Original
594 Leute haben es durchsucht

How to Acquire a Lock with a Deadline in Go?

Erwerb einer Sperre mit Frist in Go

In Go bietet der Typ sync.Mutex nur die Methoden Lock() und Unlock(). Für Szenarien, in denen eine Sperrenerfassung innerhalb einer Frist versucht oder möglicherweise sofort abgebrochen werden sollte, gibt es keine integrierte Lösung.

Vorgeschlagene Lösung: Als Mutex kanalisieren

Ein alternativer Ansatz besteht darin, einen Kanal mit einer Puffergröße von eins zu verwenden, um einen Mutex zu simulieren. Durch Senden und Empfangen eines einzelnen leeren Strukturwerts (struct{}{}) können Sperr- und Entsperrvorgänge ausgeführt werden.

Sperren:

<code class="go">l := make(chan struct{}, 1)
l <- struct{}{}</code>
Nach dem Login kopieren

Entsperren:

<code class="go"><-l</code>
Nach dem Login kopieren

Sperren versuchen:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
default:
    // lock not acquired
}</code>
Nach dem Login kopieren

Sperren mit Timeout versuchen:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
case <-time.After(time.Minute):
    // lock not acquired
}</code>
Nach dem Login kopieren

In den bereitgestellten Beispielen wird davon ausgegangen, dass s.someObj eine Zuordnung vom Schlüssel zum Wert ist.

Beispiel 1: LockBefore() für latenzempfindlichen Code

<code class="go">// DoTheThing locks before performing expensive computations.
func (s *RPCService) DoTheThing(ctx context.Context, ...) ... {
    l := make(chan struct{}, 1)
    select {
    case l <- struct{}{}:
        defer <-l
        ... expensive computation based on internal state ...
    default:
        return s.cheapCachedResponse[req.Parameter]
    }
}</code>
Nach dem Login kopieren

Beispiel 2: TryLock() zum Aktualisieren von Statistiken

<code class="go">// updateObjStats attempts to lock and update stats.
func (s *StatsObject) updateObjStats(key, value interface{}) {
    l := make(chan struct{}, 1)
    select {
    case l <- struct{}{}:
        defer <-l
        ... update stats ...
        ... fill in s.cheapCachedResponse ...
    default:
        // skip locked object
    }
}

// UpdateStats attempts to lock and update stats for all objects.
func (s *StatsObject) UpdateStats() {
    s.someObj.Range(s.updateObjStats)
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie erhalte ich eine Sperre mit Frist in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage