0Pricing
Go Academy · Ders

Goroutine'leri Kısıtlama

Eşzamanlılığı denetleyin

Goroutine'leri Kısıtlama, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. 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.

Eşzamanlılığı kısıtlama

Bazen saniye başına işlem sayısını değil, aynı anda kaç gorutinin çalışacağını sınırlamanız gerekir. Bu, zamanlamadan bağımsız olarak bir kaynak üzerindeki eşzamanlı yükü sınırlar.

  • Paralelliği sınırlar
  • Bağlantı havuzlarını korur
  • Bellek artışlarını önler

Semafor kanalı

Tamponlu bir kanal, sayan bir semafor olarak çalışır. Kanalın kapasitesi, en yüksek eşzamanlılık değerine eşittir. Edinme işleminde bir belirteç gönderilir; bırakma işleminde bir belirteç alınır.

sem := make(chan struct{}, 3)

Edinme ve bırakma

Çalışmayı başlatmadan önce bir yuva edinmek için kanala gönderim yapın (kanal doluysa işlem bekler). İşiniz bittiğinde yuvayı serbest bırakmak için kanaldan alım yapın; böylece başka bir gorutin için yer açılır.

sem <- struct{}{}        // acquire
// do work
<-sem                    // release

Neden struct{}

Boş bir yapı olan struct{}{} sıfır bayt yer kaplar. Bunu kanal öğesi olarak kullanmak, semaforu gereksiz bellek tüketmeyen, yalnızca sinyal gönderen bir yapıya dönüştürür.

Döngüyü kısıtlama

Her görev için bir gorutin başlatın, ancak her birini semaforla denetleyin. Aynı anda en fazla cap gorutin gerçek işi yapar; diğerleri edinme noktasında bekler.

for _, task := range tasks {
    sem <- struct{}{}
    go func(t Task) {
        defer func() { <-sem }()
        process(t)
    }(t)
}

WaitGroup ile birlikte kullanma

Semafor eşzamanlılığı sınırlar, ancak her şeyin ne zaman tamamlandığını bildirmez. Tüm görevleri beklemek için semaforu bir sync.WaitGroup ile birlikte kullanın.

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    defer func() { <-sem }()
    process(t)
}()

defer ile bırakma

Yuva, iş paniklese veya erken dönse bile serbest kalsın diye her zaman bir defer içinde bırakma işlemi yapın. Bırakmayı unutmak yuvaların sızmasına ve sonunda yeni edinme işlemlerinin kilitlenmesine neden olur.

Kısıtlamalı çalıştırmanın tamamı

Bu program, en fazla iki görevi eşzamanlı çalıştırarak sekiz görevi yürütür; sınırın nasıl uygulandığını göstermek için başlangıç ve bitiş mesajlarını yazdırır.

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    sem := make(chan struct{}, 2)
    var wg sync.WaitGroup
    for i := 0; i < 8; i++ {
        wg.Add(1)
        sem <- struct{}{}
        go func(id int) {
            defer wg.Done()
            defer func() { <-sem }()
            fmt.Println("start", id)
            time.Sleep(20 * time.Millisecond)
            fmt.Println("end", id)
        }(i)
    }
    wg.Wait()
    fmt.Println("done")
}

SetLimit ile errgroup

golang.org/x/sync/errgroup paketi, bir grubu kısıtlamak ve ilk hatayı aktarmak için SetLimit yöntemini sunar. Harici bir paket olsa da birçok durumda daha temiz bir alternatiftir.

Kısıtlama ve çalışan havuzu

Çalışan havuzu, kuyruktan görev alan sabit sayıdaki gorutini yeniden kullanır. Semaforla kısıtlama ise her görev için bir gorutin başlatır, ancak etkin olanların sayısını sınırlar. Çok büyük görev sayılarında havuzlar daha az kaynak tüketir; semaforlar ise sonradan eklenmesi daha kolay bir çözümdür.

Sınırı seçme

Veritabanı çağrıları için sınırı, bağlantı havuzunuzun boyutuna eşit veya bundan küçük ayarlayın. Dışa giden HTTP istekleri için bunu ana bilgisayarın bağlantı sınırıyla eşleştirin. Sınırın çok yüksek olması kaynakların tükenmesine, çok düşük olması ise kapasitenin boşa gitmesine neden olur.

Hızlı Kontrol

Kısıtlama bilginizi sınayın.

Özet

Gorutin kısıtlamasını öğrendiniz:

  • Tamponlu bir kanal, sayan bir semafor görevi görür
  • Gönderimle edinin, defer içinde alımla bırakın
  • struct{} öğeleri sıfır bayta mal olur
  • Tamamlanmayı beklemek için WaitGroup ile birlikte kullanın
  • Sınırın boyutunu korunan kaynağa göre belirleyin

Sıkça Sorulan Sorular

“Goroutine'leri Kısıtlama” dersi ücretsiz mi?

Evet — “Goroutine'leri Kısıtlama” 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.

“Goroutine'leri Kısıtlama” dersinde ne öğreneceğim?

Eşzamanlılığı denetleyin 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 3. dersidir.

“Goroutine'leri Kısıtlama” 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. Belirteç Kovası Kavramı
  2. golang.org/x/time/rate
  3. Goroutine'leri Kısıtlama
  4. Geri Çekilme ve Yeniden Deneme
← Go Academy Sayfasına Dön