Frage:
Sie erstellen ein Tool, das mehrere HTTP-Aufrufe verarbeitet in gleichzeitigen Goroutinen. Um ein unbestimmtes Ausführungsszenario zu verhindern, suchen Sie nach einer Möglichkeit, die Goroutinen nach einer bestimmten Zeitspanne abzubrechen.
Lösung:
Während der Ansatz, eine Goroutine in den Ruhezustand zu versetzen für eine bestimmte Dauer und das Senden einer Broadcast-Nachricht zum Abbrechen der anderen Goroutinen erscheint logisch, es scheint hierbei ein Problem mit der Ausführung von Goroutinen zu geben Szenario.
Um diese Herausforderung anzugehen, sollten Sie die Nutzung des Kontextpakets in Go in Betracht ziehen. Es bietet eine effektive Möglichkeit, Zeitüberschreitungen und Kontextabbrüche für Goroutinen zu handhaben.
Code-Snippet:
Hier ist ein Beispiel für die Verwendung des Kontextpakets für die Zeitüberschreitungsverwaltung von Goroutinen:
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("cancelled") } fmt.Println("used:", time.Since(t)) } func main() { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) go test(ctx) // cancel context after 30 milliseconds time.Sleep(30 * time.Millisecond) cancel() }
Dieser Code erstellt einen Kontext mit einem Timeout von 50 Millisekunden. Anschließend wird eine Goroutine gestartet, um die Testfunktion auszuführen und dabei den Kontext zu übergeben. Innerhalb der Testfunktion wartet eine Select-Anweisung darauf, dass entweder die Zeitüberschreitung eintritt oder der Kontext abgebrochen wird. Nach 30 Millisekunden wird der Kontext abgebrochen, wodurch die Goroutine beendet wird und „abgebrochen“ ausgibt.
Das obige ist der detaillierte Inhalt vonWie kann das „Kontext'-Paket von Go zum Timeout von Goroutinen verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!