0Pricing
Go Academy · Ders

WithCancel ve WithTimeout

İptal edilebilir ve süreli bağlamlar oluşturma

WithCancel ve WithTimeout, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

context.WithCancel

WithCancel, bir iptal işlevine sahip yeni bir Context türetir. cancel çağrıldığında türetilen Context'in ve tüm alt Context'lerinin Done kanalı kapanır.

ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)

İptali her zaman defer edin

cancel çağrısının yapılmaması, üst Context'i izleyen goroutinin sızmasına neden olur. İptal edilebilir bir Context oluşturduktan hemen sonra her zaman cancel'ı defer edin.

context.WithTimeout

WithTimeout, verilen süre geçtikten sonra otomatik olarak iptal edilen bir Context türetir. Bu, WithDeadline için kolaylık sağlayan bir sarmalayıcıdır.

ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
    // err may be context.DeadlineExceeded
}

Err() denetimi

Done kapatıldıktan sonra ctx.Err() nedeni döndürür: context.Canceled (açıkça iptal edildi) veya context.DeadlineExceeded (zaman aşımı).

if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
    log.Println("timeout")
}

Başka bir goroutinden iptal etme

İptal işlevini herhangi bir goroutinden ve aynı anda birden çok goroutinden çağırmak güvenlidir. Yalnızca ilk çağrının etkisi olur.

ctx, cancel := context.WithCancel(context.Background())
go func() {
    if detectError() { cancel() }
}()

HTTP isteği zaman aşımı

Gelen isteğin Context'i üzerinde WithTimeout kullanarak istek başına bir zaman aşımı ayarlayın:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
    defer cancel()
    result, err := service.Call(ctx)
    // ...
}

Zincirleme iptal

Bir üst Context iptal edilirse tüm türetilmiş Context'ler (alt ve torun Context'ler) otomatik olarak iptal edilir ve çağrı ağacındaki tüm goroutinler durdurulur.

Sınamalarda Context

Sınamalar tarafından başlatılan goroutinlerin süre bakımından sınırlandırılmasını sağlamak için sınamalarda context.Background() veya context.WithTimeout kullanın.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)

Kitaplıklar boyunca Context yayma

Aldığınız Context'i dışarı yapılan çağrılara (veritabanı sorguları, HTTP çağrıları, RPC çağrıları) her zaman geçirin. Son tarihi sıfırlamak için özel bir nedeniniz olmadıkça onu yok saymayın veya değiştirmeyin.

Arka plan işi için Context oluşturma

Bir istekle ilişkili olmayan arka plan işleri için kök olarak context.Background() kullanın ve işin düzgün bir şekilde durdurulabilmesi için bir WithCancel ekleyin.

Done ile select

İş tamamlanmadan önce Context iptal edildiğinde engellenmeyi önlemek için iş kanalıyla birlikte her zaman ctx.Done() üzerinde select yapın.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

Hızlı Kontrol

context.WithCancel ile context.WithTimeout arasındaki fark nedir?

Özet: WithCancel ve WithTimeout

Ana noktalar:

  • Oluşturduktan hemen sonra cancel() çağrısını her zaman defer edin
  • WithTimeout, sürenin sonunda otomatik olarak iptal eder; DeadlineExceeded döndürür
  • ctx.Err(), Canceled ile DeadlineExceeded arasındaki farkı belirtir
  • İptal, türetilen tüm Context'lere yayılır

Sıkça Sorulan Sorular

“WithCancel ve WithTimeout” dersi ücretsiz mi?

Evet — “WithCancel ve WithTimeout” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“WithCancel ve WithTimeout” dersinde ne öğreneceğim?

İptal edilebilir ve süreli bağlamlar oluşturma Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“WithCancel ve WithTimeout” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. context.Context Neden Var?
  2. WithCancel ve WithTimeout
  3. WithDeadline ve WithValue
  4. HTTP ve Veritabanı Çağrılarında Bağlam
← Go Academy Sayfasına Dön