Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierung einer nicht wiedereintrittsfähigen Golang-Funktion

Implementierung einer nicht wiedereintrittsfähigen Golang-Funktion

(*-*)浩
(*-*)浩Original
2019-12-17 13:53:132709Durchsuche

Implementierung einer nicht wiedereintrittsfähigen Golang-Funktion

Eine nicht wiedereintrittsfähige Funktion ist eine Funktion, die zu jedem Zeitpunkt nur einmal ausgeführt werden kann, unabhängig davon, wie oft sie aufgerufen wird und wie viele Goroutinen vorhanden sind.

Ein Dienst fragt jede Sekunde bestimmte Bedingungen ab und überwacht einen bestimmten Status. Wir wollen, dass jeder Zustand unabhängig und ohne Blockierung überprüft wird.

Die Implementierung könnte so aussehen: Wir entscheiden uns dafür, jede Statusprüfung in einer eigenen Goroutine auszuführen, damit CheckAnotherStatus() nicht auf den Abschluss von CheckSomeStatus() wartet. Jede Überprüfung dauert normalerweise nur kurze Zeit, deutlich weniger als eine Sekunde. Aber was passiert, wenn die Ausführung von CheckAnotherStatus() selbst mehr als eine Sekunde dauert? Möglicherweise liegt eine unerwartete Netzwerk- oder Festplattenverzögerung vor, die sich auf die Ausführungszeit der Prüfung auswirkt.

Ist es sinnvoll, eine Funktion zweimal gleichzeitig auszuführen? Wenn nicht, möchten wir, dass es nicht wiedereintrittsfähig ist.

Blockierende, nicht wiedereintrittsfähige Funktionen

Eine einfache Möglichkeit, zu verhindern, dass eine Funktion mehrmals ausgeführt wird, ist die Verwendung von sync.Mutex.

Angenommen, es geht uns nur darum, diese Funktion aus der obigen Schleife aufzurufen, können wir die Sperre von außerhalb der Funktion implementieren:

func main() {
    tick := time.Tick(time.Second)     
    go func() {         
        for range tick {             
            go CheckSomeStatus()             
            go CheckAnotherStatus()         
        }     
    }() 
}

Der obige Code garantiert CheckAnotherStatus () Wird nicht durch mehrere Iterationen der Schleife ausgeführt. Wenn CheckAnotherStatus() zuvor ausgeführt wurde, würden alle nachfolgenden Iterationen der Schleife durch den Mutex blockiert.

Die Blockierungslösung hat die folgenden Eigenschaften:

Sie gewährleistet so viele Aufrufe von „CheckAnotherStatus()“ wie die Anzahl der Schleifeniterationen.

Unter der Annahme, dass die Ausführung von „CheckAnotherStatus()“ blockiert ist, führen nachfolgende Iterationen zu Anforderungen zum Aufrufen derselben Funktion.

Ertrag, nicht wiedereintretende Funktion

Es macht wahrscheinlich keinen Sinn, sich für die nächsten 10 Anrufe in unserer Statusüberprüfungsgeschichte zu stapeln. Eine blockierte CheckAnotherStatus()-Ausführung wird abgeschlossen, alle 10 Aufrufe werden plötzlich nacheinander ausgeführt und können innerhalb der nächsten Sekunde abgeschlossen werden, wobei 10 identische Prüfungen in derselben Sekunde abgeschlossen werden.

Eine andere Lösung besteht darin, sich zu ergeben. Eine gewinnbringende Lösung ist:

Brechen Sie die Ausführung von „CheckAnotherStatus()“ ab, wenn diese bereits ausgeführt wurde.

Führt höchstens eine Ausführung von „CheckAnotherStatus()“ durch.

Im Vergleich zur Anzahl der Schleifeniterationen können tatsächlich weniger Aufrufe von „CheckAnotherStatus()“ ausgeführt werden.

Das obige ist der detaillierte Inhalt vonImplementierung einer nicht wiedereintrittsfähigen Golang-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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