0Pricing
Go Academy · Ders

İşçi Havuzu Örüntüsü

Sabit boyutlu bir goroutine işçi havuzu oluşturma

İşçi Havuzu Örüntüsü, 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.

İşçi Havuzu Nedir?

İşçi havuzu, paylaşılan bir kuyruktan işleri işleyen sabit sayıda eşzamanlı rutini önceden oluşturur. Bu, eşzamanlılığı sınırlandırarak sınırsız eşzamanlı rutin oluşturulmasının kaynakları tüketmesini önler.

Temel Uygulama

Bir işler kanalı ve bu kanaldan okuyan N eşzamanlı rutin oluşturun:

func workerPool(n int, jobs <-chan Job, results chan<- Result) {
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }
    wg.Wait()
    close(results)
}

İş Gönderme

Tüm işleri kanala gönderin, ardından kanalı kapatın. İşçiler tüm işleri işler ve kanal kapandığında aralık döngülerinden çıkar.

jobs := make(chan Job, 100)
for _, j := range allJobs {
    jobs <- j
}
close(jobs) // signals workers to stop after draining

Sonuçları Toplama

İşleri gönderirken sonuçları eşzamanlı olarak okuyun. İş havuzu için bir eşzamanlı rutin kullanın; böylece sonuçların toplanması iş gönderimiyle kilitlenmez.

results := make(chan Result, 100)
go workerPool(5, jobs, results)
for r := range results {
    collect(r)
}

Havuz Boyutunu Ayarlama

CPU'ya bağlı işler için havuz boyutunu runtime.NumCPU() olarak ayarlayın. Giriş/çıkış ağırlıklı işler için daha yüksek bir katsayı (örneğin 10×), bekleme süresinden yararlanır. En uygun noktayı bulmak için profil oluşturun.

n := runtime.NumCPU()
if ioHeavy { n = runtime.NumCPU() * 10 }

Bağlam İptali Ekleme

İptal durumunda erken durmaları için işçilere bir bağlam iletin:

for {
    select {
    case job, ok := <-jobs:
        if !ok { return }
        results <- process(ctx, job)
    case <-ctx.Done():
        return
    }
}

Semafor Seçeneği

Sabit bir eşzamanlı rutin havuzu yerine, aynı anda çalışan eşzamanlı rutinlerin sayısını sınırlamak için arabellekli bir kanalı semafor olarak kullanabilirsiniz; böylece yine de her iş için bir eşzamanlı rutin oluşturulur.

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

Hata İşleme

Sonuç yapısını kullanarak hataları sonuçlarla birlikte döndürün. İlk hatada bağlamı iptal edin veya son bir rapor için tüm hataları toplayın.

type Result struct{ Val int; Err error }

Dinamik Havuz Boyutlandırma

Uyarlanabilir havuzlar için, ağırlıklı bir kaynağın edinilip bırakılmasına ve dinamik eşzamanlılık sınırlarının desteklenmesine olanak tanıyan golang.org/x/sync/semaphore kullanın.

İşçi Havuzu ve errgroup Karşılaştırması

golang.org/x/sync/errgroup, N eşzamanlı rutin başlatmak ve ilk hatayı toplamak için daha basit bir API sağlar. Yeniden kullanılabilir işçilerden oluşan kalıcı bir kümeye ihtiyacınız olduğunda havuz kullanın.

Sorunsuz Kapanma

İşçilere sinyal göndermek için işler kanalını kapatın. WaitGroup tamamlandıktan sonra sonuçları kapatın. Bekleyen iş gönderimleri close(jobs) çağrısından önce yapılmalıdır.

Hızlı Kontrol

Bir işçi havuzu, işçilere işlemeyi durdurmaları gerektiğini nasıl bildirir?

Özet: İşçi Havuzu

Temel noktalar:

  • Sabit sayıda N eşzamanlı rutin tek işler kanalından okur
  • İşçilere tamamlanmaları gerektiğini bildirmek için işler kanalını kapatın
  • WaitGroup tamamlanmayı izler; tamamlandığında sonuçları kapatın
  • CPU'ya bağlı işler: havuz boyutu ≈ NumCPU; giriş/çıkış ağırlıklı işler: daha büyük

Sıkça Sorulan Sorular

“İşçi Havuzu Örüntüsü” dersi ücretsiz mi?

Evet — “İşçi Havuzu Ö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.

“İşçi Havuzu Örüntüsü” dersinde ne öğreneceğim?

Sabit boyutlu bir goroutine işçi havuzu 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 4. dersidir.

“İşçi Havuzu Ö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. select Deyimi
  2. Zaman Aşımları ve Zamanlayıcılar
  3. Fan-in ve Fan-out Örüntüleri
  4. İşçi Havuzu Örüntüsü
← Go Academy Sayfasına Dön