Özet - context
- Go kursu
- Orta seviye
- Ders 34/80
- 4 dk
Context türlerini birleştirerek iptal edilebilir bir istek yazarsın.
context özeti
Kök: Background. Türetmeler: WithCancel (elle iptal), WithTimeout (göreli süre), WithDeadline (mutlak zaman), WithValue (istek kapsamlı veri). Her türetmeden sonra defer cancel(). İptal ağaç boyunca aşağı doğru yayılır, yukarı çıkmaz.
Background
└─ WithTimeout(2s) ← istek
├─ WithValue(kullanici)
└─ WithCancel ← paralel alt işlercontext.AfterFunc ve WithoutCancel
Go 1.21 iki yardımcı ekledi: context.AfterFunc(ctx, f) context iptal edilince f'yi ayrı bir goroutine'de çalıştırır (temizlik için); context.WithoutCancel(ctx) değerleri koruyup iptali koparır — istek bittikten sonra da sürmesi gereken bir denetim kaydı yazarken kullanışlıdır.
Uygulama Paralel iptal
Bir WithCancel context'i ile üç goroutine başlat; her biri <-ctx.Done() bekleyip wg.Done() çağırsın. cancel() çağır, wg.Wait() ile bekle ve "hepsi durdu" yazdır.
Başlangıç kodu
package main
import (
"context"
"fmt"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"context"
"fmt"
"sync"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
<-ctx.Done()
}()
}
cancel()
wg.Wait()
fmt.Println("hepsi durdu")
}Beklenen çıktı
hepsi durdu
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir alt context iptal edilince üst context'e ne olur?
- Değerleri silinir
- Hiçbir şey; iptal yalnızca aşağı yayılır Doğru cevap
- O da iptal olur
- Süresi uzar
Açıklama: Context ağacında iptal sinyali çocuklara iner; kardeşler ve üst etkilenmez.
2 İptal sonrası iş
stop := context.____(ctx, func() { log.Println("temizlik") })
defer stop()
stop := context.AfterFunc(ctx, func() { log.Println("temizlik") })
defer stop()
Açıklama: AfterFunc context iptal olunca verilen fonksiyonu çalıştırır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
WithCancel |
Elle iptal |
WithTimeout |
Süre sınırı |
WithValue |
İstek verisi |
WithoutCancel |
İptali koparır |