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
- Pola Worker Pool
- Fan-Out Fan-In
- Tahap Pipeline
- Penghentian yang Mulus