Go Academy · Pelajaran

Fan-Out Fan-In

Agihkan dan kumpulkan kerja

Pelajaran 2 daripada 413 langkah

Fan-Out Fan-In ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Pengagihan Keluar dan Penggabungan Masuk

Pengagihan keluar bermaksud memulakan beberapa gorutin untuk membaca daripada satu saluran dan mengagihkan kerja. Penggabungan masuk bermaksud menggabungkan keluaran beberapa gorutin kembali ke dalam satu saluran.

  • Pengagihan keluar menyebarkan beban kepada worker
  • Penggabungan masuk menyatukan hasil untuk pengguna

Satu Stage Penjana

Saluran paip bermula dengan penjana: fungsi yang mengembalikan satu saluran dan menyalurkan nilai ke dalamnya daripada gorutinnya sendiri, kemudian menutupnya.

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

Mengagihkan Keluar

Untuk mengagihkan keluar, mulakan beberapa gorutin yang semuanya membaca daripada saluran masukan yang sama. Setiap gorutin menjalankan fungsi pemprosesan yang sama dan menghasilkan saluran keluarannya sendiri.

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

Satu Stage Pemprosesan

Stage square membaca daripada in, mengkuasa duakan setiap nilai dan menghantarnya ke saluran keluaran baharu. Beberapa tika stage ini berkongsi 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 Masuk dengan merge

Penggabungan masuk menggabungkan beberapa saluran menjadi satu. sync.WaitGroup menjejaki gorutin bagi setiap saluran, manakala gorutin penutup menunggu kesemuanya sebelum menutup keluaran yang 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 WaitGroup

Setiap gorutin penggabungan menyalin satu saluran masukan ke dalam out. Kita tidak boleh menutup out sehingga setiap masukan selesai dibaca. WaitGroup mengira penyalin yang aktif; gorutin penutup tersekat pada wg.Wait() sehingga semuanya selesai.

Menangkap Pemboleh Ubah Gelung

Dalam Go versi lama, fungsi penutupan mesti menerima c sebagai parameter supaya setiap gorutin mengikat salurannya sendiri, bukan pemboleh ubah gelung yang dikongsi. Menghantar c secara jelas mengelakkan pepijat pemboleh ubah gelung yang lazim.

Pengagihan Keluar dan Penggabungan Masuk Lengkap

Atur cara ini menjana nombor, mengagihkannya keluar kepada dua stage square, kemudian menggabungkan masuk dan menjumlahkan hasil yang 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

Oleh sebab dua stage square bersaing untuk memproses masukan yang sama, urutan keluaran yang digabungkan tidak bersifat deterministik. Jika anda memerlukan urutan, sertakan indeks pada setiap item atau gunakan satu stage sahaja.

Bila Perlu Mengagihkan Keluar

Agihkan keluar apabila sesuatu stage menjadi titik kesesakan dan kerja itu boleh diproses secara selari. Jika penjana hulu perlahan, menambah lebih banyak worker hiliran tidak akan membantu; worker tersebut hanya akan terbiar.

Tekanan Balik

Saluran tanpa penimbal menghasilkan tekanan balik semula jadi: stage yang pantas tersekat apabila pengguna yang perlahan tidak dapat mengikutinya. Hal ini menghalang pertumbuhan memori tanpa had di seluruh saluran paip.

Semakan Pantas

Uji pengetahuan anda tentang penggabungan masuk.

Imbas Kembali

Anda telah mempelajari pengagihan keluar dan penggabungan masuk:

  • Pengagihan keluar: beberapa gorutin membaca satu saluran
  • Penggabungan masuk: menggabungkan banyak saluran menjadi satu melalui WaitGroup
  • Urutan tidak dikekalkan merentas stage selari
  • Saluran tanpa penimbal menyediakan tekanan balik
Percuma untuk bermula

Pelajari Go dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Fan-Out Fan-In” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “Fan-Out Fan-In”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Fan-Out Fan-In”?

Agihkan dan kumpulkan kerja Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Go Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Fan-Out Fan-In” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Corak Kumpulan Pekerja
  2. Fan-Out Fan-In
  3. Peringkat Pipeline
  4. Penutupan Berperingkat
← Kembali ke Go Academy