Go Academy · Ders

Eşzamanlı Hata Yönetimi için errgroup

golang.org/x/sync/errgroup'u uygulamada kullanma

2. ders / 413 adım

Eşzamanlı Hata Yönetimi için errgroup, 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.

Goroutine'ler ve hatalarla ilgili sorun

go func() ile goroutine başlatmak, hatalar da dahil olmak üzere dönüş değerlerini yok sayar. Bunları toplamak için ek mekanizmalara (kanallar, WaitGroup) ihtiyaç duyarsınız. errgroup bunu basitleştirir.

golang.org/x/sync/errgroup

errgroup.Group, goroutine'leri çalıştırır ve hataları toplar. Wait(), tüm goroutine'ler tamamlanana kadar bekler ve nil olmayan ilk hatayı döndürür.

var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
    log.Fatal(err)
}

errgroup.WithContext

WithContext, bir grup ve türetilmiş bir bağlam döndürür. İlk goroutine bir hata döndürdüğünde bağlam iptal edilir ve kalan işler durdurulur.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

Sonuçları hatalarla birlikte toplama

errgroup yalnızca hataları toplar, sonuçları toplamaz. Eşzamanlama ihtiyacını önlemek için sonuçları önceden ayrılmış ve dizin üzerinden erişilen dilimlerde saklayın:

results := make([]Result, len(items))
for i, item := range items {
    i, item := i, item
    g.Go(func() error {
        r, err := process(ctx, item)
        if err != nil { return err }
        results[i] = r
        return nil
    })
}
if err := g.Wait(); err != nil { return err }

g.SetLimit (Go 1.20+)

g.SetLimit(n), eşzamanlı çalışan goroutine sayısını sınırlar — ayrı bir kanal gerektirmeyen satır içi bir semafor gibi davranır.

g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
    g.Go(func() error { return process(item) })
}

g.TryGo

g.TryGo(f), yalnızca SetLimit ile belirlenen sınır izin veriyorsa goroutine'i başlatır. Başlatılmadığında false döndürür.

Yalnızca ilk hata döndürülür

errgroup yalnızca ilk hatayı döndürür. Tüm hatalara ihtiyacınız varsa bunları her goroutine içinde muteks korumalı bir dilimde toplayın.

var mu sync.Mutex
var errs []error
g.Go(func() error {
    if err := doWork(); err != nil {
        mu.Lock(); errs = append(errs, err); mu.Unlock()
    }
    return nil
})

sync.WaitGroup'dan farkı

WaitGroup tamamlanmayı izler; errgroup ise tamamlanmayı izler VE hataları toplar. Herhangi bir goroutine hatasının bildirilmesi gerekiyorsa errgroup'ı tercih edin.

Bağlam iptalinin yayılması

errgroup.WithContext kullanıldığında, türetilen bağlamın iptal sinyali diğer tüm goroutine'lere durmaları gerektiğini bildirir — ilk hatada iptal semantiğine benzer.

errgroup kodunu sınama

Sınamalarda, bir goroutine takılırsa grubun sonsuza kadar çalışmamasını sağlamak için WithTimeout içeren bir bağlam enjekte edin.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

Semafor alternatifi

SetLimit'ten önce (Go < 1.20), aynı etkiyi elde etmek için tek tek goroutine'lerin içinde bir semafor olarak arabelleğe alınmış kanal kullanın.

Kısa kontrol

errgroup.WithContext, düz errgroup.Group'ın döndürmediği neyi döndürür?

Özet: errgroup

Temel noktalar:

  • g.Go(func() error) — başlatır ve ilk hatayı toplar
  • g.Wait() — tümü tamamlanana kadar bekler; ilk hatayı döndürür
  • WithContext — ilk hatada bağlam iptal edilir
  • g.SetLimit(n) — eşzamanlı goroutine'leri sınırlar (Go 1.20+)
Başlamak ücretsiz

Yapay zeka eğitmeniyle Go öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Eşzamanlı Hata Yönetimi için errgroup” dersi ücretsiz mi?

Evet — “Eşzamanlı Hata Yönetimi için errgroup” 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.

“Eşzamanlı Hata Yönetimi için errgroup” dersinde ne öğreneceğim?

golang.org/x/sync/errgroup'u uygulamada kullanma 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.

“Eşzamanlı Hata Yönetimi için errgroup” 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. Pipeline ve Aşama Örüntüleri
  2. Eşzamanlı Hata Yönetimi için errgroup
  3. Semafor Örüntüsü
  4. Sızıntı Algılama ve İptal
← Go Academy Sayfasına Dön