Concurrency Patterns: Fan-Out/Fan-In Deseni Adım Adım
Bir işi birden fazla goroutine'e dağıtıp (fan-out), sonuçları toplamak (fan-in) için kullanılan desendir. Örneğin 10 farklı API'ye istek atıp hepsinin cevabını beklemek gibi.
Fan-out: Bir channel'dan veri oku, birden fazla goroutine'e gönder.
Fan-in: Birden fazla channel'dan veri oku, tek bir channel'a yaz.
Sayılar listesini 3 goroutine'e dağıtıp, karelerini hesaplayalım:
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main23import (4"fmt"5"sync"6)78func main() {9sayilar:= []int{1, 2, 3, 4, 5, 6}1011// Fan-Out: Sayıları 3 worker'a dağıt12workers:= 313girisChan:= make(chan int)1415// Fan-In: Sonuçları topla16sonucChan:= make(chan int)17var wg sync.WaitGroup1819// Worker'ları başlat20for i:= 0; i < workers; i++ {21wg.Add(1)22go worker(girisChan, sonucChan, &wg)23}2425// Sayıları gönder (ayrı goroutine'de)26go func() {27for _, sayi:= range sayilar {28girisChan <- sayi29}30close(girisChan)31}()3233// Sonuçları oku34go func() {35wg.Wait()36close(sonucChan)37}()3839for sonuc:= range sonucChan {40fmt.Println("Kare:", sonuc)41}42}4344func worker(girisChan <-chan int, sonucChan chan<- int, wg *sync.WaitGroup) {45defer wg.Done()46for sayi:= range girisChan {47sonucChan <- sayi * sayi48}49}Çıktı:
1Kare: 12Kare: 43Kare: 94Kare: 165Kare: 256Kare: 36- Fan-Out:
girisChanaçılır, 3 worker goroutine başlatılır - Dağıtım: Sayılar sırayla channel'a yazılır
- İşleme: Her worker kendi hızında sayıyı alıp karesi hesaplar
- Fan-In:
WaitGrouptüm worker'ları bekler, sonrasonucChankapatılır - Okuma: Main goroutine sonuçları channel'dan okur
- Ağır işleri paralel yap
- Kaynakları verimli kullan
- Bekleme sürelerini azalt
- Ölçeklenebilir kod yaz
Bu desen API çağrıları, dosya işleme, veri analizi gibi yerlerde hayat kurtarır. (Go'da Eş Zamanlılık Desenleri: Worker Pool Uygulaması)
5 yorum
Ya bu pattern aslında çok pratik özellikle APIlerden paralel veri çekerken Ama channelı
channelı nasıl kullanmak lazım tam anlamadım hangi tarafta veri yazıyorsun hangi tarafta
Bir tarafta veri gönderen var diğer tarafta alan var Gönderen goroutine channela yazıyor
Tamam o zaman alan taraf da `< ` operatörüyle channeldan okuyor yani Yani gönderen `chan
aynen gönderen `chan < ` ile yazıyor alan `< chan` ile okuyor fan out kısmında 3 workerı