Go Academy · Ders

Sızıntı Algılama ve İptal

Goroutine'lerin çıkmasını sağlama ve sızıntıları önleme

4. ders / 413 adım

Sızıntı Algılama ve İptal, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. 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.

Goroutin sızıntısı nedir?

Bir goroutin başlatılıp hiç sonlandırılmadığında goroutin sızıntısı oluşur. Sızan goroutinler zamanla birikerek yığın belleği ve CPU tüketir; işlem sonlandırılana kadar bu durum devam eder.

Yaygın sızıntı: engellenen kanal alımı

Hiçbir zaman değer almayan bir kanal alımını bekleyen goroutin sonsuza kadar engellenir:

go func() {
    v := <-ch // leaks if no sender and ch is never closed
    use(v)
}()

Yaygın sızıntı: tamamlanma sinyali yok

Çıkış koşulu veya done kanalı olmayan bir for döngüsündeki goroutin sonsuza kadar çalışır:

go func() {
    for {
        work()
        // no exit condition — leaks
    }
}()

Sızıntıları goleak ile algılama

go.uber.org/goleak, bir sınamanın sonunda hiçbir goroutin sızıntısı olmadığını doğrular:

func TestMyFunc(t *testing.T) {
    defer goleak.VerifyNone(t)
    myFunc() // should not leak goroutines
}

Çözüm olarak bağlam

Uzun süre çalışan goroutinleri durdurmanın deyimsel yolu bir bağlam kullanmaktır. ctx değerini goroutine aktarın ve ctx.Done() üzerinde select yapın.

go func(ctx context.Context) {
    for {
        select {
        case work := <-workCh:
            process(work)
        case <-ctx.Done():
            return // clean exit
        }
    }
}(ctx)

Done kanalı deseni

Bağlam gerektirmeyen daha basit durumlarda özel bir done kanalı kullanın. Bu kanaldan okuyan tüm goroutinlere durma sinyali yayınlamak için kanalı kapatın.

done := make(chan struct{})
go func() {
    select {
    case v := <-data: use(v)
    case <-done: return
    }
}()
close(done) // stops goroutine

runtime ile algılama

Çalışma zamanında büyümeyi algılamak için goroutin sayısını yazdırın:

fmt.Println("goroutines:", runtime.NumGoroutine())

HTTP sunucusu goroutinleri

net/http her istek için goroutinleri otomatik olarak yönetir ve istek tamamlandığında bunları temizler. Ancak temizleme yapmadan goroutin başlatan işleyiciler yine de sızıntıya neden olabilir.

Sızıntıları sınama

Sınama paketinizi goleak ile TestMain olarak veya sınama başına defer kullanarak çalıştırın. Sınama gövdesinden sonra sonlandırılmayan herhangi bir goroutin, sınamanın başarısız olmasına neden olur.

func TestMain(m *testing.M) {
    goleak.VerifyTestMain(m)
}

Time.After sızıntıları

time.After kullanarak bir döngü içindeki select yapmanız, her yinelemede, tetiklenene kadar çöp toplayıcı tarafından toplanamayan yeni bir zamanlayıcı oluşturur. Bunun yerine time.NewTimer ve Reset kullanın.

Hata döndüren goroutinden kaynaklanan sızıntı

Bir goroutinin bir kanal üzerinden sonuç göndermesi bekleniyor, ancak gönderme yapmadan hata nedeniyle erken dönüyorsa tüketici goroutin sonsuza kadar engellenir. Tüm yollarda her zaman kanala gönderim yapın veya kanalı kapatın.

Hızlı Kontrol

Go'da uzun süre çalışan bir goroutini durdurmanın en deyimsel yolu nedir?

Özet: Sızıntı Algılama ve İptal

Temel noktalar:

  • Goroutin sızıntıları birikir; runtime.NumGoroutine() ile izleyin
  • Sınamalardaki goleak, goroutin sızıntılarını otomatik olarak yakalar
  • Goroutinlere her zaman bir çıkış yolu sağlayın: bağlam, done kanalı veya kapatılmış girdi
  • Döngülerde time.After zamanlayıcı sızıntılarına yol açar; NewTimer+Reset kullanın
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

“Sızıntı Algılama ve İptal” dersi ücretsiz mi?

Evet — “Sızıntı Algılama ve İptal” 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.

“Sızıntı Algılama ve İptal” dersinde ne öğreneceğim?

Goroutine'lerin çıkmasını sağlama ve sızıntıları önleme 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 4. dersidir.

“Sızıntı Algılama ve İptal” 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