0Pricing
Go Academy · Pelajaran

Fan-Out Fan-In

Distribusikan dan kumpulkan pekerjaan

Fan-Out Fan-In adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Penyebaran dan Penggabungan

Penyebaran berarti menjalankan beberapa goroutine untuk membaca dari satu kanal dan membagi pekerjaan. Penggabungan berarti menggabungkan keluaran beberapa goroutine kembali ke dalam satu kanal.

  • Penyebaran membagi beban ke beberapa worker
  • Penggabungan memusatkan hasil untuk konsumen

Stage Pembangkit

Alur dimulai dengan pembangkit: fungsi yang mengembalikan kanal dan memasukkan nilai ke dalamnya dari goroutine miliknya sendiri, lalu menutup kanal tersebut.

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

Melakukan Penyebaran

Untuk melakukan penyebaran, jalankan beberapa goroutine yang semuanya membaca dari kanal masukan yang sama. Masing-masing menjalankan fungsi pemrosesan yang sama dan menghasilkan kanal keluaran sendiri.

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

Stage Pemrosesan

Stage square membaca dari in, menguadratkan setiap nilai, lalu mengirimkannya ke kanal keluaran baru. Beberapa instans stage ini berbagi satu masukan.

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

Menggabungkan dengan merge

Penggabungan menyatukan beberapa kanal menjadi satu. sync.WaitGroup melacak goroutine untuk setiap kanal, dan goroutine penutup menunggu semuanya selesai sebelum menutup keluaran yang telah digabungkan.

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
}

Mengapa Menggunakan WaitGroup

Setiap goroutine penggabung menyalin satu kanal masukan ke out. Kita tidak boleh menutup out sampai semua masukan terkuras. WaitGroup menghitung penyalin yang aktif; goroutine penutup terblokir pada wg.Wait() sampai semuanya selesai.

Menangkap Variabel Perulangan

Dalam Go versi lama, closure harus menerima c sebagai parameter agar setiap goroutine mengikat kanalnya sendiri, bukan variabel perulangan bersama. Meneruskan c secara eksplisit menghindari bug klasik variabel perulangan.

Penyebaran dan Penggabungan Lengkap

Program ini menghasilkan numbers, melakukan penyebaran ke dua stage square, lalu melakukan penggabungan dan menjumlahkan hasil yang telah digabungkan.

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)
}

Urutan Tidak Dijamin

Karena dua stage square berlomba memproses masukan yang sama, urutan keluaran yang digabungkan bersifat nondeterministik. Jika Anda memerlukan urutan, tambahkan indeks ke setiap item atau gunakan satu stage.

Kapan Melakukan Penyebaran

Lakukan penyebaran ketika sebuah stage menjadi hambatan dan pekerjaannya dapat diparalelkan. Jika pembangkit di hulu lambat, menambahkan lebih banyak worker di hilir tidak akan membantu; worker tersebut hanya akan kekurangan pekerjaan.

Tekanan Balik

Kanal tanpa buffer menciptakan tekanan balik alami: stage yang cepat akan terblokir ketika konsumen yang lambat tidak mampu mengimbanginya. Hal ini mencegah pertumbuhan memori yang tidak terbatas di seluruh alur.

Pemeriksaan Singkat

Uji pemahaman Anda tentang penggabungan.

Ringkasan

Anda telah mempelajari penyebaran dan penggabungan:

  • Penyebaran: beberapa goroutine membaca satu kanal
  • Penggabungan: menyatukan banyak kanal menjadi satu melalui WaitGroup
  • Urutan tidak dipertahankan di seluruh stage paralel
  • Kanal tanpa buffer menyediakan tekanan balik

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Fan-Out Fan-In” gratis?

Ya — teks lengkap “Fan-Out Fan-In” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Fan-Out Fan-In”?

Distribusikan dan kumpulkan pekerjaan Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Fan-Out Fan-In” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pola Worker Pool
  2. Fan-Out Fan-In
  3. Tahap Pipeline
  4. Penghentian yang Mulus
← Kembali ke Go Academy