Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Corak Fanin dalam Go

Corak Fanin dalam Go

WBOY
WBOYasal
2024-07-28 15:17:33762semak imbas

Fanin Pattern in Go

Mari kita lihat corak kipas masuk. Ini sangat berguna apabila kami mempunyai data berkaitan daripada berbilang urutan yang perlu kami kumpulkan.

Sebagai contoh, katakan anda telah membuat beberapa panggilan API ke perkhidmatan yang berbeza dan anda perlu menggabungkan hasilnya.

Ini adalah corak yang sangat mudah untuk dilaksanakan, tetapi anda perlu memberi perhatian kepada cara anda mengendalikan saluran. Mudah mendapat keadaan buntu.

// produce is used to simulate the different data sources
func produce(id int) chan int {
    ch := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            ch <- id*10 + i
        }
        fmt.Printf("producer %d done\n", id)
        close(ch) // this is important!!!
    }()
    return ch
}

func fanin(inputs ...chan int) chan int {
    output := make(chan int)

    var wg sync.WaitGroup
    for i, input := range inputs {
        wg.Add(1)
        go func() {
            for value := range input {
                output <- value
            }
            fmt.Printf("done merging source %d\n", i)
            wg.Done()
        }()
    }
    go func() {
        wg.Wait()
        close(output) // this is important!!!
    }()

    return output
}

func main() {
    input1 := produce(0)
    input2 := produce(1)

    result := fanin(input1, input2)

    done := make(chan bool)
    go func() {
        for value := range result {
            fmt.Printf("got %d\n", value)
        }
        close(done)
    }()
    <-done
    fmt.Println("done")
}

Di sini kami menggunakan fungsi menghasilkan untuk mensimulasikan sumber yang berbeza. Saluran sumber ini dihantar ke fungsi fanin yang menjalankan operasi penggabungan.

Fungsi fanin mencipta saluran output, kemudian melancarkan goroutine yang beroperasi pada setiap input. Kami menggunakan WaitGroup untuk menunjukkan apabila semua sumber input telah digabungkan ke dalam saluran output.

Dalam contoh mudah ini, utas utama hanya berulang pada output. Perhatikan bahawa tiada jaminan pada pesanan, nilai daripada 2 input bercampur.

Perkara penting yang perlu dikemukakan ialah kita perlu menutup saluran keluaran apabila kita selesai menggabungkan input. Operator julat akan menunggu selama-lamanya setelah saluran kosong. Ulas baris tutup(output) dan anda akan melihat bahawa anda mendapat keadaan buntu.

Bagaimana kita boleh memperbaiki perkara ini? Tinggalkan saya komen di bawah.

Terima kasih!

Kod untuk siaran ini dan semua siaran dalam siri ini boleh didapati di sini

Atas ialah kandungan terperinci Corak Fanin dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn