WithCancel und WithTimeout
Abbrechbare und zeitlich begrenzte Kontexte erstellen
WithCancel und WithTimeout ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
context.WithCancel
WithCancel leitet einen neuen Context mit einer Cancel-Funktion ab. Der Aufruf von cancel schließt den Done-Channel des abgeleiteten Contexts und aller seiner untergeordneten Contexts.
ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)cancel immer mit defer aufrufen
Wenn Sie cancel nicht aufrufen, bleibt die Goroutine aktiv, die den übergeordneten Context überwacht. Rufen Sie cancel direkt nach dem Erstellen eines abbrechbaren Contexts immer mit defer auf.
context.WithTimeout
WithTimeout leitet einen Context ab, der nach der angegebenen Dauer automatisch abgebrochen wird. Die Funktion ist eine praktische Variante von WithDeadline.
ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
// err may be context.DeadlineExceeded
}Err() prüfen
Nachdem Done geschlossen wurde, gibt ctx.Err() den Grund zurück: context.Canceled (explizit abgebrochen) oder context.DeadlineExceeded (Timeout).
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
log.Println("timeout")
}Abbruch aus einer anderen Goroutine
Die Cancel-Funktion kann aus jeder Goroutine und gleichzeitig aus mehreren Goroutines sicher aufgerufen werden. Nur der erste Aufruf hat eine Wirkung.
ctx, cancel := context.WithCancel(context.Background())
go func() {
if detectError() { cancel() }
}()Timeout für HTTP-Anfragen
Legen Sie mit WithTimeout für den Context der eingehenden Anfrage ein Timeout pro Anfrage fest:
func handler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
result, err := service.Call(ctx)
// ...
}Kaskadierender Abbruch
Wenn ein übergeordneter Context abgebrochen wird, werden alle abgeleiteten Contexts (untergeordnete Contexts und deren Nachfolger) automatisch abgebrochen. Dadurch werden alle Goroutines im Aufrufbaum beendet.
Context in Tests
Verwenden Sie in Tests context.Background() oder context.WithTimeout, um sicherzustellen, dass von den Tests gestartete Goroutines zeitlich begrenzt sind.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)Context durch Bibliotheken weitergeben
Übergeben Sie den erhaltenen Context immer an ausgehende Aufrufe (Datenbankabfragen, HTTP-Aufrufe, RPCs). Verwerfen oder ersetzen Sie ihn niemals, es sei denn, Sie haben einen bestimmten Grund, die Deadline zurückzusetzen.
Context für einen Hintergrundjob erstellen
Verwenden Sie für Hintergrundjobs, die nicht an eine Anfrage gebunden sind, context.Background() als Root-Context und ergänzen Sie WithCancel, damit der Job ordnungsgemäß beendet werden kann.
select mit Done
Wählen Sie immer ctx.Done() zusammen mit dem Arbeits-Channel in einer select-Anweisung aus, damit keine Blockierung auftritt, wenn der Context abgebrochen wird, bevor die Arbeit abgeschlossen ist.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}Schnelltest
Was ist der Unterschied zwischen context.WithCancel und context.WithTimeout?
Zusammenfassung: WithCancel und WithTimeout
Wichtige Punkte:
- Rufen Sie cancel() direkt nach der Erstellung immer mit defer auf
- WithTimeout bricht nach Ablauf der Dauer automatisch ab; es gibt DeadlineExceeded zurück
- ctx.Err() unterscheidet zwischen Canceled und DeadlineExceeded
- Der Abbruch wird an alle abgeleiteten Contexts weitergegeben
Lerne Go mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „WithCancel und WithTimeout“ kostenlos?
Ja — der vollständige Text von „WithCancel und WithTimeout“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „WithCancel und WithTimeout“?
Abbrechbare und zeitlich begrenzte Kontexte erstellen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „WithCancel und WithTimeout“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum context.Context existiert
- WithCancel und WithTimeout
- WithDeadline und WithValue
- Context in HTTP- und Datenbankaufrufen