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>
Entsperren:
<code class="go"><-l</code>
Sperren versuchen:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }</code>
Sperren mit Timeout versuchen:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }</code>
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>
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>
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!