CodeBlanks Logo Icon CodeBlanks

Özet - context

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şler

context.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

main.go
package main

import (
    "context"
    "fmt"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ş

Soru
stop := context.____(ctx, func() { log.Println("temizlik") })
defer stop()
Cevap
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

Orta seviye bölümündeki tüm dersler