Çalışan Havuzu Örüntüsü
Eşzamanlılığı sınırlandırın
Çalışan Havuzu Örüntüsü, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 1. 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
Bir işçi havuzu, işlerin tümünün paylaşılan bir kanaldan çekildiği sabit sayıda gorutin başlatır. Her görev için bir gorutin oluşturmak yerine, N işçi oluşturur ve onlara iş verirsiniz.
- Eşzamanlı işlemlerin sayısını sınırlar
- Binlerce gorutin oluşturmak yerine mevcut gorutinleri yeniden kullanır
- Veritabanları veya API'ler gibi paylaşılan kaynakları korur
Eşzamanlılığı Neden Sınırlamalı
Sınırsız gorutinler belleği veya dosya tanımlayıcılarını tüketebilir ya da alt düzey bir hizmeti aşırı yükleyebilir. Havuz, aynı anda ne kadar iş çalışacağını denetlemeniz için bir ayar sunar.
Getirilecek 10000 URL'niz varsa, aynı anda 10000 HTTP isteği göndermek istemezsiniz. 20 işçiden oluşan bir havuz durumu makul tutar.
jobs Kanalı
İşler bir jobs kanalına akar. Her işçi, for range döngüsünde bu kanaldan okur. Kanal kapandığında döngü sona erer ve işçi çıkar.
jobs := make(chan int, 100)
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)Tek Bir İşçi
İşçi, jobs kanalı üzerinde dolaşan bir işlevden ibarettir. Her işi işler ve sonucu bir sonuçlar kanalına yazar.
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}Birden Çok İşçi Başlatma
Havuzu basit bir döngüyle başlatın. Her yineleme, aynı işçi işlevini çalıştıran bir gorutin başlatır. Tüm işçiler aynı jobs ve sonuçlar kanallarını paylaşır.
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}Yönlü Kanal Türleri
İşçi imzasındaki <-chan int (yalnızca alma) ve chan<- int (yalnızca gönderme) türlerine dikkat edin. Bu yönlü türler, derleyicinin bir işçinin yanlışlıkla jobs kanalına göndermesini veya sonuçlar kanalından okumasını engellemesini sağlar.
Sonuçları Toplama
Tüm işleri gönderdikten ve kanalı kapattıktan sonra, ana gorutin iş sayısı kadar sonucu okur. Bu, programın erken çıkmaması için programı eşzamanlar.
sum := 0
for a := 1; a <= 5; a++ {
sum += <-results
}
fmt.Println("total:", sum)Çalıştırılabilir Eksiksiz Bir Havuz
İşte tüm kalıp tek bir programda: üç işçi beş sayıyı ikiyle çarpar. Çalıştırıp toplamı gözlemleyin.
package main
import "fmt"
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}
func main() {
jobs := make(chan int, 5)
results := make(chan int, 5)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
total := 0
for a := 1; a <= 5; a++ {
total += <-results
}
fmt.Println("total:", total)
}Arabellekli ve Arabeldeksiz
Arabellekli bir jobs kanalı, arabellek dolana kadar üreticinin engellenmeden iş kuyruğa almasını sağlar. Arabeldeksiz bir kanal ise elden teslimi zorunlu kılar: gönderme, bir işçi hazır olana kadar engellenir. Arabellekleme, ani iş üreten üreticilerin akışını dengeler.
Havuz Boyutunu Seçme
CPU'ya bağlı işler için havuz boyutunu runtime.NumCPU() değerine yakın seçin. IO'ya bağlı işler için (ağ, disk) işçiler hesaplama yapmak yerine beklediğinden çok daha yüksek bir değer kullanabilirsiniz.
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("CPUs:", runtime.NumCPU())
}Gorutin Sızıntılarından Kaçınma
close(jobs) çağrısını unutursanız, işçiler boş bir kanalda sonsuza kadar engellenir ve sızıntı oluşur. Tüm işler gönderildikten sonra jobs kanalını her zaman kapatın; böylece for range döngüleri sonlanır.
Hızlı Kontrol
worker havuzlarını anlayıp anlamadığınızı test edin.
Özet
worker havuzu desenini öğrendiniz:
- Paylaşılan jobs kanalından okuyan sabit sayıda worker başlatma
- Güvenlik için yönlü kanal türlerini kullanma
- worker'ları sonlandırmak için jobs kanalını kapatma
- Tamamlanmayı eşzamanlamak için sonuçları toplama
- Havuz boyutunu iş yükü türüne göre (CPU veya IO) belirleme
Sıkça Sorulan Sorular
“Çalışan Havuzu Örüntüsü” dersi ücretsiz mi?
Evet — “Çalışan 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.
“Çalışan Havuzu Örüntüsü” dersinde ne öğreneceğim?
Eşzamanlılığı sınırlandırın 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 1. dersidir.
“Çalışan 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
- Çalışan Havuzu Örüntüsü
- Fan-Out Fan-In
- İşlem Hattı Aşamaları
- Zarif Kapatma