Bagaimana untuk Mengelakkan Kebuntuan Apabila Bersiar-siar di Saluran Buffer dalam GoLang?

Linda Hamilton
Lepaskan: 2024-10-26 17:51:02
asal
131 orang telah melayarinya

How to Avoid Deadlock When Ranging Over a Buffered Channel in GoLang?

Kebuntuan dalam GoLang: Mengapa Julat Melepasi Saluran Penimbalan?

Apabila menggunakan saluran penimbal dalam GoLang, adalah penting untuk mengelak daripada mewujudkan situasi kebuntuan . Isu baru-baru ini menimbulkan kebimbangan tentang kebuntuan yang dihadapi semasa cuba menjangkau saluran penimbal selepas semua gorout selesai.

Kod yang disediakan cuba menggunakan saluran penimbal dengan kapasiti 4 dan menghasilkan 4 gorout yang menghantar data ke saluran. Walau bagaimanapun, jalan buntu berlaku kerana:

  • Saiz saluran terlalu kecil, menyebabkan gorouti disekat menunggu untuk menulis ke saluran penuh.
  • Julat operasi pada saluran kekal selama-lamanya menunggu elemen tiba, sementara tiada gorouti yang tinggal untuk menulis.

Penyelesaian 1: Kembangkan Saiz Saluran dan Tutup Selepas Selesai

Untuk menyelesaikan kebuntuan, saluran boleh ditambah saiz dan ditutup selepas semua goroutine selesai:

<code class="go">ch := make(chan []int, 5)
...
wg.Wait()
close(ch)</code>
Salin selepas log masuk

Walau bagaimanapun, ini menghapuskan faedah saluran paip, kerana ia menghalang pencetakan sehingga semua tugasan selesai.

Penyelesaian 2: Penyelesaian Isyarat dari dalam Rutin Pencetakan

Untuk mendayakan saluran paip sebenar, fungsi Done() boleh dipanggil dalam rutin pencetakan:

<code class="go">func main() {
    ch := make(chan []int, 4)
    ...
    go func() {
        for c := range ch {
            fmt.Printf("c is %v\n", c)
            wg.Done()
        }
    }()
    ...
}</code>
Salin selepas log masuk

Pendekatan ini memastikan bahawa fungsi Done() hanya dipanggil selepas setiap elemen telah dicetak, dengan berkesan menandakan siapnya setiap goroutine.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Bersiar-siar di Saluran Buffer dalam GoLang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!