WithCancel
- Go kursu
- Orta seviye
- Ders 30/80
- 4 dk
WithCancel ile iptal edilebilir context öğrenirsin.
WithCancel
context.WithCancel(ust) bir alt context ve bir cancel fonksiyonu döndürür. cancel() çağrılınca alt context ve ondan türeyen tüm context'ler iptal olur; üst etkilenmez.
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // kaynak sızmasın
go izle(ctx)
// ...
cancel() // izle goroutine'i dururcancel birden çok kez çağrılabilir; ilk çağrıdan sonrakiler etkisizdir.
İptali dinleyen goroutine
Uzun çalışan bir goroutine her döngü adımında iptali kontrol eder:
func izle(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("durdu:", ctx.Err())
return
case <-time.After(100 * time.Millisecond):
fmt.Println("kontrol")
}
}
}İptal işbirlikçidir: context goroutine'i zorla durdurmaz, goroutine sinyali kontrol edip kendisi çıkar.
Uygulama İptal et
WithCancel ile context oluştur. Bir goroutine <-ctx.Done() bekleyip ctx.Err()'i bir kanala göndersin. main cancel() çağırıp kanaldan gelen değeri yazdırsın.
Başlangıç kodu
package main
import (
"context"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"context"
"fmt"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
sonuc := make(chan error)
go func() {
<-ctx.Done()
sonuc <- ctx.Err()
}()
cancel()
fmt.Println(<-sonuc)
}Beklenen çıktı
context canceled
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>cancel</code> hiç çağrılmazsa ne olur?
- Context otomatik iptal olur
- Context ve bağlı kaynaklar üst iptal edilene kadar bellekte kalır Doğru cevap
- Hiçbir şey
- Program çöker
Açıklama: go vet bu yüzden "cancel fonksiyonu kullanılmadı" uyarısı verir; defer cancel() alışkanlık olmalıdır.
2 Kaynağı bırak
ctx, cancel := context.WithCancel(ctx)
____ cancel()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
Açıklama: defer cancel() fonksiyon bitince context'e bağlı kaynakları serbest bırakır.
3 İptal zinciri
| Kavram | Anlamı |
|---|---|
cancel() |
Alt context'leri iptal eder |
Üst context |
Etkilenmez |
ctx.Err() |
context.Canceled |
select + Done |
İptali dinler |