Erwerb von Schlössern mit Zeitbeschränkungen in Golang
Bei der Arbeit mit Schlössern in Golang gibt es Situationen, in denen Sie entweder ein Schloss erwerben müssen sofort melden oder eine Frist einhalten. Während der sync.Mutex der Standardbibliothek nur die Funktionen Lock() und Unlock() bereitstellt, gibt es eine Technik, mit der Sie eine Sperre mit einer Frist emulieren können.
Implementieren einer Sperre mit einer Frist
Um eine Sperre mit einer Frist zu erstellen, können Sie einen Kanal mit einer Puffergröße von eins verwenden:
l := make(chan struct{}, 1)
Zum Sperren einen Strukturwert an den Kanal senden:
lZum Entsperren vom Kanal empfangen :
Durchführen einer Versuchssperre
Um einen zu versuchen Versuchen Sie es mit Lock, verwenden Sie eine Select-Anweisung:
select { case lDieser Code erhält die Sperre sofort, sofern sie verfügbar ist. Wenn die Sperre bereits gehalten wird, blockiert die SELECT-Anweisung, bis die Sperre aufgehoben wird.
Versuchssperre mit Zeitüberschreitung
Um eine Zeitüberschreitung für die Versuchssperre anzugeben, fügen Sie hinzu ein time.After()-Kanal zur select-Anweisung:
select { case lDieser Code versucht bis zu einer Minute lang, die Sperre zu erlangen. Wenn die Zeitüberschreitung abläuft, wird die Select-Anweisung beendet und die Sperre wird nicht erworben.
Schlussfolgerung
Verwenden eines Kanals mit einer Puffergröße von eins als Mutex ermöglicht Ihnen die Implementierung einer Try-Sperre mit einer Frist. Diese Technik kann in Szenarien nützlich sein, in denen Sie schnell oder innerhalb eines bestimmten Zeitrahmens eine Sperre erwerben müssen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3