Sobes.tech
Senior

Was passiert, wenn man den ursprünglichen Kontext der HTTP-Anfrage an eine GoRoutine übergibt?

sobes.tech KI

Antwort von AI

Wenn der ursprüngliche Kontext (context.Context) einer HTTP-Anfrage an eine separate GoRoutine übergeben wird, wird der Kontext in dieser GoRoutine ebenfalls abgebrochen, wenn der ursprüngliche Kontext (z.B. bei Stornierung oder Timeout) beendet wird. Dies kann zu einer unerwarteten Unterbrechung der Arbeit der GoRoutine führen, wenn sie von diesem Kontext abhängt.

Daher sollte, wenn die GoRoutine unabhängig vom Lebenszyklus der HTTP-Anfrage arbeiten soll, ein separater Kontext (z.B. mit context.Background() oder context.WithCancel()) erstellt werden, um ein vorzeitiges Beenden zu vermeiden. Andernfalls ist die Verwendung des ursprünglichen Kontexts nützlich, um die Lebensdauer der mit der Anfrage verbundenen Operationen korrekt zu steuern.

Beispiel:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Diese GoRoutine endet, wenn ctx abgebrochen wird
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Arbeit beendet")
        case <-ctx.Done():
            fmt.Println("Kontext abgebrochen")
        }
    }(ctx)
    w.Write([]byte("Antwort gesendet"))
}