irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 183
- Tepkime puanı
- 2
- Puanları
- 18
Go’nun
İşte en yaygın üç eşzamanlılık deseni:
goroutine ve channel yapısı, karmaşık iş yüklerini yönetmek için basit ama çok güçlü desenler (concurrency patterns) sunar. Bu modelleri anlamak, uygulamanızın kaynaklarını boşa harcamadan binlerce işlemi paralel olarak yönetmenizi sağlar.İşte en yaygın üç eşzamanlılık deseni:
1. Fan-Out (Yelpaze Dışa)
Fan-Out, tek bir kaynaktan gelen işlerin, paralel olarak işlenmesi için birden fazla goroutine'e dağıtılmasıdır. Ağır hesaplama gerektiren veya uzun süren işlemleri hızlandırmak için kullanılır.- Nasıl Çalışır? Bir ana goroutine, işleri bir kanala gönderir; birden fazla "worker" (işçi) aynı kanalı dinleyerek işleri paylaşır.
2. Fan-In (Yelpaze İçe)
Fan-In, birden fazla kaynaktan gelen verilerin tek bir kanalda birleştirilmesidir. Farklı servislerden veya goroutine'lerden gelen sonuçları tek bir yerden okumak istediğinizde kullanılır.- Nasıl Çalışır? Birden fazla kanal, birleştirici (multiplexer) bir fonksiyona veri gönderir ve bu fonksiyon tüm verileri tek bir çıkış kanalına yönlendirir.
Kod:
func fanIn(input1, input2 <-chan string) <-chan string {
c := make(chan string)
go func() {
for {
select {
case s := <-input1: c <- s
case s := <-input2: c <- s
}
}
}()
return c
}
3. Worker Pool (İşçi Havuzu) Modeli
Bu, sistem kaynaklarını korumak için en kritik desendir. Sınırsız sayıda goroutine açmak yerine, sabit sayıda "işçi" oluşturup işleri bir kuyruk (queue) üzerinden yönetmenizi sağlar.- Neden Önemli? Eğer 1 milyon isteği 1 milyon goroutine ile karşılarsanız bellek ve CPU darboğazı oluşabilir. Worker Pool, bu yükü örneğin sadece 100 goroutine ile sırayla işlemenizi sağlar.
Örnek Worker Pool Yapısı:
Go
Kod:
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("İşçi %d işe başladı: %d\n", id, j)
time.Sleep(time.Second) // İş simülasyonu
results <- j * 2
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 3 adet işçi oluştur (Havuz)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// İşleri gönder
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// Sonuçları topla
for a := 1; a <= numJobs; a++ {
<-results
}
}
Modellerin Karşılaştırması
| Model | Ne Zaman Kullanılır? | Temel Faydası |
| Fan-Out | Elinizde çok iş, az zaman varsa. | Paralellik ve hız kazandırır. |
| Fan-In | Farklı kaynaklardan veri topluyorsanız. | Veri akışını merkezileştirir. |
| Worker Pool | Kaynakları (CPU/RAM) kontrol altında tutmak istiyorsanız. | Aşırı yüklenmeyi (overloading) önler. |