0Pricing
Go Academy · Ders

Fan-Out Fan-In

Çalışmayı dağıtın ve toplayın

Fan-Out Fan-In, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. 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.

İş Dağıtma ve Birleştirme

İş dağıtma, işi dağıtmak üzere tek bir kanaldan okuyan birkaç gorutin başlatmak anlamına gelir. İş birleştirme ise birkaç gorutinin çıktısını yeniden tek bir kanalda birleştirmek anlamına gelir.

  • İş dağıtma, yükü worker'lar arasında yayar
  • İş birleştirme, tüketici için sonuçları bir araya getirir

Bir Üretici stage

İşlem hattı bir üreticiyle başlar: kendi gorutininden değerleri bir kanala aktaran, ardından kanalı kapatan bir işlev.

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

İş Dağıtma

İş dağıtmak için aynı girdi kanalından okuyan birden çok gorutin başlatın. Her biri aynı işleme işlevini çalıştırır ve kendine ait bir çıktı kanalı üretir.

in := gen(1, 2, 3, 4, 5)
c1 := square(in)
c2 := square(in)

Bir İşleme stage'i

square stage'i in kanalından okur, her değerin karesini alır ve bunu yeni bir çıktı kanalına gönderir. Bu stage'in birden çok örneği tek bir girdiyi paylaşır.

func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

merge ile Birleştirme

İş birleştirme, birkaç kanalı tek bir kanalda toplar. sync.WaitGroup, kanal başına çalışan gorutinleri izler; kapatıcı gorutin ise birleştirilmiş çıktıyı kapatmadan önce hepsini bekler.

func merge(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        go func(c <-chan int) {
            for n := range c {
                out <- n
            }
            wg.Done()
        }(c)
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

WaitGroup Neden Kullanılır

Birleştirme gorutinlerinin her biri bir girdi kanalındaki verileri out kanalına kopyalar. Her girdi tamamen boşaltılmadan out kanalını kapatmamalıyız. WaitGroup etkin kopyalayıcıların sayısını tutar; kapatıcı gorutin, kopyalayıcılar tamamlanana kadar wg.Wait() üzerinde bekler.

Döngü Değişkenini Yakalama

Eski Go sürümlerinde closure, her gorutinin paylaşılan döngü değişkeni yerine kendi kanalını bağlaması için c parametresini almalıdır. c değerini açıkça geçirmek, klasik döngü değişkeni hatasını önler.

Eksiksiz İş Dağıtma ve Birleştirme

Bu program sayılar üretir, bunları iki square stage'ine dağıtır, ardından birleştirir ve birleştirilmiş sonuçları toplar.

package main

import (
    "fmt"
    "sync"
)

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() { for _, n := range nums { out <- n }; close(out) }()
    return out
}

func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() { for n := range in { out <- n * n }; close(out) }()
    return out
}

func merge(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        go func(c <-chan int) { for n := range c { out <- n }; wg.Done() }(c)
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

func main() {
    in := gen(1, 2, 3, 4, 5)
    c1 := square(in)
    c2 := square(in)
    total := 0
    for n := range merge(c1, c2) {
        total += n
    }
    fmt.Println("sum of squares:", total)
}

Sıra Garanti Edilmez

İki square stage'i aynı girdi üzerinde yarıştığından, birleştirilmiş çıktının sırası belirli değildir. Sıralamaya ihtiyacınız varsa her öğeye bir dizin ekleyin veya tek bir stage kullanın.

Ne Zaman İş Dağıtılmalı

Bir stage darboğaz olduğunda ve iş paralel yürütülebilir olduğunda iş dağıtın. Yukarı akıştaki üretici yavaşsa, daha fazla aşağı akış worker'ı eklemek yardımcı olmaz; bu worker'lar yalnızca iş bekler.

Geri Basınç

Arabelleksiz kanallar doğal bir geri basınç oluşturur: yavaş bir tüketici yetişemediğinde hızlı bir stage engellenir. Bu, işlem hattı boyunca belleğin sınırsız büyümesini önler.

Hızlı Kontrol

İş birleştirme konusundaki bilginizi test edin.

Özet

İş dağıtmayı ve birleştirmeyi öğrendiniz:

  • İş dağıtma: birden çok gorutin tek bir kanaldan okur
  • İş birleştirme: WaitGroup aracılığıyla birçok kanalı tek kanalda birleştirir
  • Paralel stage'ler arasında sıra korunmaz
  • Arabelleksiz kanallar geri basınç sağlar

Sıkça Sorulan Sorular

“Fan-Out Fan-In” dersi ücretsiz mi?

Evet — “Fan-Out Fan-In” 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.

“Fan-Out Fan-In” dersinde ne öğreneceğim?

Çalışmayı dağıtın ve toplayı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 2. dersidir.

“Fan-Out Fan-In” 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. Çalışan Havuzu Örüntüsü
  2. Fan-Out Fan-In
  3. İşlem Hattı Aşamaları
  4. Zarif Kapatma
← Go Academy Sayfasına Dön