Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man Goroutinen mithilfe des Kontexts nach einer festgelegten Zeit ordnungsgemäß stoppen?

Wie kann man Goroutinen mithilfe des Kontexts nach einer festgelegten Zeit ordnungsgemäß stoppen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-20 14:48:18772Durchsuche

How to Gracefully Stop Goroutines After a Set Time Using Context?

So stoppen Sie Goroutinen nach einer bestimmten Dauer mithilfe des Kontexts

Problemhintergrund

Bei Lasttests, bei denen zahlreiche HTTP-Aufrufe in Goroutinen orchestriert werden, wird dies der Fall entscheidend, um die Ausführungsdauer dieser Routinen zu steuern. Dadurch können Benutzer den Auslastungstest zu einem vordefinierten Zeitpunkt beenden.

Ein gescheiterter Ansatz

Ein häufiger Versuch, dies zu erreichen, besteht darin, Goroutinen zu verwenden, um die Dauer von time.Sleep() zu überwachen und Beendigungssignale zu senden über Kanäle. Während diese Methode in bestimmten Fällen ausreichen kann, schlägt sie fehl, wenn Goroutinen weiterhin HTTP-Aufrufe außerhalb der Haupt-Goroutine durchführen.

Die Lösung: Kontexte verwenden

Go 1.7 führt das wesentliche Kontextpaket ein, um dieses Problem zu beheben . Kontexte bieten eine strukturierte Möglichkeit zum Abbrechen und Überwachen der Goroutine-Ausführung und bieten eine zuverlässige Lösung für die zeitbasierte Beendigung.

package main

import (
    "context"
    "fmt"
    "time"
)

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}

Erklärung:

  1. Innerhalb der Testfunktion ein Kontext mit Es wird eine Zeitüberschreitung von 50 Millisekunden erstellt.
  2. Eine SELECT-Anweisung prüft, ob der Time.After-Kanal ein Ereignis hat (das den Abschluss des Ruhezustands anzeigt) oder ob der Kontext abgebrochen wurde.
  3. Wenn der Kontext eine Zeitüberschreitung aufweist , wird die Select-Anweisung beendet und zeigt an, dass die Goroutine abgebrochen wurde.

Dieser Ansatz stellt sicher, dass Goroutinen abgebrochen werden, wenn die angegebene Zeit verstrichen ist, unabhängig von ihrer Position im Code.

Das obige ist der detaillierte Inhalt vonWie kann man Goroutinen mithilfe des Kontexts nach einer festgelegten Zeit ordnungsgemäß stoppen?. 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