Heim > Backend-Entwicklung > Golang > Wie kann man Goroutinen in Go elegant aussetzen?

Wie kann man Goroutinen in Go elegant aussetzen?

Patricia Arquette
Freigeben: 2024-11-19 11:56:02
Original
1038 Leute haben es durchsucht

How to Gracefully Timeout Goroutines in Go?

So überschreiten Sie Goroutinen in Go, um die Ausführungszeit zu steuern

Goroutinen, ein integraler Bestandteil der Go-Parallelität, ermöglichen die asynchrone Ausführung von Aufgaben. Manchmal ist es jedoch notwendig, die Dauer dieser Routinen zu kontrollieren und zu verhindern, dass sie auf unbestimmte Zeit ausgeführt werden.

Hintergrund und Problem

In Ihrem Lasttest-Tool möchten Sie dies tun Beenden Sie Goroutinen nach einer bestimmten Zeit, um die Dauer des HTTP-Aufrufprozesses zu begrenzen. Der aktuelle Ansatz, bei dem time.Sleep() innerhalb einer Goroutine verwendet wird, schafft einen Kommunikationskanal, führt jedoch zu einer vorzeitigen Beendigung von Goroutinen.

Lösung mit Kontext

Ein weiteres Der empfohlene Ansatz umfasst die Verwendung des Pakets golang.org/x/net/context (verfügbar in der Standardbibliothek in Go 1.7), insbesondere der Schnittstelle context.Context. Kontext bietet einen Mechanismus zum Abbrechen oder Zeitüberschreiten von Goroutinen.

Der folgende Codeausschnitt demonstriert diese Lösung:

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)
}
Nach dem Login kopieren

In diesem Code:

  • Ein Kontext. Der Kontext wird mit einem Timeout von 50 Millisekunden mithilfe von context.WithTimeout() erstellt.
  • Die Goroutine test() wird ausgeführt Dieser Kontext und wartet auf Anweisungen über select.
  • Nach Ablauf des Timeouts empfängt select das ctx.Done()-Signal und verlässt die Goroutine ordnungsgemäß, um ein Verschlafen zu verhindern.

Das obige ist der detaillierte Inhalt vonWie kann man Goroutinen in Go elegant aussetzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage