Rumah > pembangunan bahagian belakang > Golang > Corak Keselarasan Saluran Paip dalam Go: Panduan Visual Komprehensif

Corak Keselarasan Saluran Paip dalam Go: Panduan Visual Komprehensif

DDD
Lepaskan: 2024-12-31 14:23:11
asal
478 orang telah melayarinya

⚠️ Bagaimana untuk meneruskan siri ini?

1. Jalankan Setiap Contoh: Jangan baca kod sahaja. Taipkannya, jalankan dan perhatikan tingkah lakunya.
2. Eksperimen dan Pecah Perkara: Alih keluar tidur dan lihat apa yang berlaku, tukar saiz penimbal saluran, ubah suai kiraan goroutine.
Memecahkan perkara mengajar anda cara ia berfungsi
3. Sebab Tentang Gelagat: Sebelum menjalankan kod yang diubah suai, cuba ramalkan hasilnya. Apabila anda melihat tingkah laku yang tidak dijangka, berhenti seketika dan fikirkan mengapa. Cabar penjelasan.
4. Bina Model Mental: Setiap visualisasi mewakili konsep. Cuba lukis gambar rajah anda sendiri untuk kod yang diubah suai.

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Dalam catatan kami sebelum ini, kami meneroka corak konkurensi Generator, blok binaan corak konkurensi Go yang lain. Anda boleh membacanya di sini:

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Corak Konkurensi Penjana dalam Go: Panduan Visual

Souvik Kar Mahapatra ・ 25 Dis

#pergi #tutorial #pengaturcaraan #pembelajaran

Sekarang, mari kita lihat bagaimana primitif ini bergabung untuk membentuk corak berkuasa yang menyelesaikan masalah dunia sebenar.

Dalam siaran ini kami akan membincangkan Corak Saluran Paip dan akan cuba menggambarkannya. Oleh itu, mari bersiap sedia kerana kita akan mengendalikan proses tersebut.

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Corak Saluran Paip

Saluran paip adalah seperti talian pemasangan di kilang, di mana setiap peringkat melaksanakan tugas tertentu pada data dan menghantar hasilnya ke peringkat seterusnya.

Kami membina saluran paip dengan menyambungkan goroutine dengan saluran, dengan setiap goroutine mewakili peringkat yang menerima data, memprosesnya dan menghantarnya ke peringkat seterusnya.

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Mari kita laksanakan saluran paip mudah yang:

  1. Menjana nombor
  2. Petak dua
  3. Mencetak hasilnya
// Stage 1: Generate numbers
func generate(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range nums {
            out <- n
        }
    }()
    return out
}

// Stage 2: Square numbers
func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for n := range in {
            out <- n * n
        }
    }()
    return out
}

// Stage 3: Print numbers
func print(in <-chan int) {
    for n := range in {
        fmt.Printf("%d ", n)
    }
    fmt.Println()
}

func main() {
    // Connect the pipeline
    numbers := generate(2, 3, 4)    // Stage 1
    squares := square(numbers)       // Stage 2
    print(squares)                   // Stage 3
}
Salin selepas log masuk
Salin selepas log masuk

✏️ Bait pantas

<-chan int menandakan saluran terima sahaja.
Saluran jenis <-chan int hanya boleh digunakan untuk menerima nilai, bukan untuk menghantarnya. Ini berguna untuk menguatkuasakan corak komunikasi yang lebih ketat dan mengelakkan penulisan secara tidak sengaja ke saluran oleh penerima.

chan int Ini menandakan saluran dua arah.
Saluran jenis chan int boleh digunakan untuk menghantar dan menerima nilai.

Mari kita teruskan dan bayangkan contoh di atas:

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Di sini anda boleh melihat setiap blok binaan saluran paip adalah goroutine mengikut corak penjana. Menyiratkan bahawa sebaik sahaja data sedia di mana-mana langkah langkah seterusnya dalam saluran paip boleh mula memprosesnya tidak seperti pemprosesan berjujukan.

Pengendalian Ralat dalam Talian Paip

Prinsip teras hendaklah:

  1. Setiap peringkat tahu dengan tepat apa yang perlu dilakukan dengan nilai baik dan buruk
  2. Ralat tidak boleh hilang dalam perancangan
  3. Nilai buruk tidak menyebabkan panik
  4. Mesej ralat membawa konteks tentang perkara yang salah
  5. Saluran paip boleh dilanjutkan dengan lebih banyak peringkat, dan semuanya akan menangani ralat secara konsisten

mari kemas kini kod kami dengan beberapa pengendalian ralat yang betul.

type Result struct {
    Value int
    Err   error
}

func generateWithError(nums ...int) <-chan Result {
    out := make(chan Result)
    go func() {
        defer close(out)
        for _, n := range nums {
            if n < 0 {
                out <- Result{Err: fmt.Errorf("negative number: %d", n)}
                return
            }
            out <- Result{Value: n}
        }
    }()
    return out
}

func squareWithError(in <-chan Result) <-chan Result {
    out := make(chan Result)
    go func() {
        defer close(out)
        for r := range in {
            if r.Err != nil {
                out <- r  // Forward the error
                continue
            }
            out <- Result{Value: r.Value * r.Value}
        }
    }()
    return out
}

func main() {
    // Using pipeline with error handling
    for result := range squareWithError(generateWithError(2, -3, 4)) {
        if result.Err != nil {
            fmt.Printf("Error: %v\n", result.Err)
            continue
        }
        fmt.Printf("Result: %d\n", result.Value)
    }
}
Salin selepas log masuk

Mengapa Menggunakan Corak Saluran Paip?

Mari kita ambil contoh untuk memahami dengan lebih baik, kami mempunyai aliran kerja pemprosesan data yang mengikut corak saluran paip seperti yang ditunjukkan di bawah.

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

  1. Setiap peringkat dalam saluran paip beroperasi secara bebas, berkomunikasi hanya melalui saluran. Ini membolehkan beberapa manfaat:

? Setiap peringkat boleh dibangunkan, diuji dan diubah suai secara bebas
? Perubahan pada dalaman satu peringkat tidak menjejaskan peringkat lain
? Mudah untuk menambah peringkat baharu atau mengubah suai yang sedia ada
? Pemisahan kebimbangan yang jelas

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

  1. Corak saluran paip secara semula jadi membolehkan pemprosesan selari/serentak. Setiap peringkat boleh memproses data yang berbeza secara serentak sebaik sahaja data tersedia.

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Dan bahagian yang terbaik? Kami boleh menjalankan berbilang contoh setiap peringkat (pekerja) untuk keperluan yang lebih serentak seperti:

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

?? Hei tetapi bukankah itu Corak Konkurensi Kipas-Masuk dan Kipas-Keluar?

Bingo! Tangkapan yang baik di sana. Ia sememangnya corak Fan-Out, Fan-In, yang merupakan jenis corak saluran paip tertentu. Kami akan membincangkannya secara terperinci dalam siaran seterusnya jadi jangan risau ;)

Kes penggunaan dunia sebenar

memproses imej dalam saluran paip

// Stage 1: Generate numbers
func generate(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range nums {
            out <- n
        }
    }()
    return out
}

// Stage 2: Square numbers
func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for n := range in {
            out <- n * n
        }
    }()
    return out
}

// Stage 3: Print numbers
func print(in <-chan int) {
    for n := range in {
        fmt.Printf("%d ", n)
    }
    fmt.Println()
}

func main() {
    // Connect the pipeline
    numbers := generate(2, 3, 4)    // Stage 1
    squares := square(numbers)       // Stage 2
    print(squares)                   // Stage 3
}
Salin selepas log masuk
Salin selepas log masuk

atau sesuatu yang rumit seperti saluran paip pemprosesan log

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Corak skala saluran paip

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Penskalaan Mendatar (Kipas-Keluar, Kipas-Masuk)

Corak ini sesuai untuk operasi terikat CPU di mana kerja boleh diproses secara bebas. Saluran paip mengagihkan kerja merentasi berbilang pekerja dan kemudian menggabungkan semula hasilnya. Ini amat berkesan apabila:

  1. Pemprosesan adalah intensif CPU (transformasi data, pengiraan)
  2. Tugas boleh diproses secara bebas
  3. Anda mempunyai berbilang teras CPU tersedia

Saluran Paip Penampan

Corak ini membantu mengurus ketidakpadanan kelajuan antara peringkat saluran paip. Penampan bertindak sebagai penyerap hentak, membolehkan peringkat pantas berfungsi di hadapan tanpa disekat oleh peringkat yang lebih perlahan. Ini berguna apabila:

  1. Peringkat yang berbeza mempunyai kelajuan pemprosesan yang berbeza
  2. Anda mahu mengekalkan daya pengeluaran yang stabil
  3. Penggunaan memori untuk penimbalan boleh diterima
  4. Anda perlu mengendalikan pemprosesan pecah

Pemprosesan Berkelompok

Corak ini mengoptimumkan operasi terikat I/O dengan mengumpulkan berbilang item ke dalam satu kelompok. Daripada memproses item satu demi satu, ia mengumpulkannya ke dalam kumpulan dan memprosesnya bersama-sama. Ini berkesan apabila:

  1. Anda sedang bekerja dengan sistem luaran (pangkalan data, API)
  2. Perjalanan pergi balik rangkaian adalah mahal
  3. Operasi mempunyai overhed tetap yang ketara bagi setiap permintaan
  4. Anda perlu mengoptimumkan daya pengeluaran berbanding kependaman

Setiap corak ini boleh digabungkan mengikut keperluan. Sebagai contoh, anda mungkin menggunakan pemprosesan berkelompok dengan penskalaan mendatar, di mana berbilang pekerja setiap satu memproses kelompok item. Kuncinya ialah memahami kesesakan anda dan memilih corak yang sesuai untuk menanganinya.


Itu melengkapkan penyelaman mendalam kami ke dalam corak Penjana! Akan datang seterusnya, kami akan meneroka Corak konkurensi saluran paip, di mana kita akan melihat cara merantai penjana kami bersama-sama untuk membina aliran pemprosesan data yang berkuasa.

Jika anda mendapati siaran ini membantu, mempunyai sebarang pertanyaan atau ingin berkongsi pengalaman anda sendiri dengan penjana - saya ingin mendengar daripada anda dalam ulasan di bawah. Cerapan dan soalan anda membantu menjadikan penjelasan ini lebih baik untuk semua orang.

Jika anda terlepas panduan visual untuk goroutine dan saluran Golang, lihat di sini:

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Memahami dan menggambarkan Goroutine dan Saluran di Golang

Souvik Kar Mahapatra ・ 20 Dis

#pergi #pengaturcaraan #pembelajaran #tutorial

Nantikan lebih banyak corak konkurensi Go! ?

Pipeline Concurrency Pattern in Go: A Comprehensive Visual Guide

Atas ialah kandungan terperinci Corak Keselarasan Saluran Paip dalam Go: Panduan Visual Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan