0Pricing
Go Academy · Ders

Semafor Örüntüsü

Kanal semaforuyla eşzamanlılığı sınırlama

Semafor Örüntüsü, 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.

Semafor nedir?

Semafor, bir işlemi eşzamanlı olarak gerçekleştiren goroutine sayısını sınırlar. Kaynakların tükenmesini önler (örneğin çok fazla açık veritabanı bağlantısını veya dış HTTP isteğini engeller).

Semafor olarak arabelleğe alınmış kanal

N kapasitesine sahip arabelleğe alınmış bir kanal, saymalı semafor görevi görür. Edinme işlemi kanala gönderim yapar (kanal doluyken bekler); bırakma işlemi kanaldan alım yapar.

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

func withSem(f func()) {
    sem <- struct{}{} // acquire
    defer func() { <-sem }() // release
    f()
}

Semaforla iş başına bir goroutine

Her iş için bir goroutine başlatın, ancak eşzamanlılığı bir semaforla sınırlayın:

sem := make(chan struct{}, 5)
for _, job := range jobs {
    sem <- struct{}{}
    go func(j Job) {
        defer func() { <-sem }()
        process(j)
    }(job)
}

İşlemin sonunda semaforu boşaltma

Tüm goroutine'leri başlattıktan sonra, dönmeden önce hepsinin tamamlandığından emin olmak için semaforu boşaltın:

// After the loop, acquire all N slots (blocks until all goroutines release)
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

golang.org/x/sync/semaphore

Ağırlıklı bir semafor için (örneğin kaynak ağırlıkları farklı olan goroutine'lerde) semaphore.Weighted türünü kullanın:

s := semaphore.NewWeighted(100)
// acquire 10 units
if err := s.Acquire(ctx, 10); err != nil { return err }
defer s.Release(10)
// do work

Bağlam duyarlı edinme

Ağırlıklı semaforun Acquire işlemi bir bağlama uyar; semafor kullanılabilir hâle gelmeden önce bağlam iptal edilirse bir hata döndürür.

TryAcquire

s.TryAcquire(n), yalnızca n birim hemen kullanılabiliyorsa bunları edinir; aksi durumda false döndürür. Engelleme yapmadan yapılan denetimler için kullanışlıdır.

Semafor ve çalışan havuzu karşılaştırması

Çalışan havuzunda sabit bir dizi kalıcı goroutine bulunur. Semafor, goroutine'leri gerektiğinde başlatmanıza ve eşzamanlılığı sınırlamanıza olanak tanır. İşlerin geliş hızı büyük ölçüde değişiyorsa semafor kullanın.

HTTP eşzamanlılığını sınırlama

Çok fazla eşzamanlı dış isteği veya gelen istek işleyicisi goroutine'ini önlemek için bir HTTP işleyicisini ya da istemcisini semaforla sarın.

Veritabanı bağlantılarını sınırlama

Semafor yerine db.SetMaxOpenConns(n) ve db.SetMaxIdleConns(m) ayarlarını yapın — sql paketi bağlantı havuzunun eşzamanlılığını dahili olarak yönetir.

Semafor adaleti

Arabelleğe alınmış kanal semaforları yaklaşık olarak adildir (gönderim yapmak için bekleyen goroutine'ler açısından FIFO düzenindedir), ancak kesin bir garanti vermez. Ağırlıklı semafor paketi daha sıkı adalet garantileri sağlar.

Hızlı Kontrol

Arabellekli bir kanal semaforu nasıl uygular?

Özet: Semafor Deseni

Temel noktalar:

  • Basit semaforlar için arabellekli kanal sem := make(chan struct{}, N)
  • Edinmek için gönderin, serbest bırakmak için alın; serbest bırakma işlemini her zaman defer ile yapın
  • Ağırlıklı ve bağlam farkında varyant için golang.org/x/sync/semaphore kullanın
  • Basit grup başına eşzamanlılık sınırları için errgroup.SetLimit kullanın

Sıkça Sorulan Sorular

“Semafor Örüntüsü” dersi ücretsiz mi?

Evet — “Semafor Örüntüsü” 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.

“Semafor Örüntüsü” dersinde ne öğreneceğim?

Kanal semaforuyla eşzamanlılığı sınırlama 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.

“Semafor Örüntüsü” 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