Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengelakkan Kebuntuan Apabila Bersiar-siar di Saluran Buffer dalam GoLang?

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

Linda Hamilton
Linda Hamiltonasal
2024-10-26 17:51:02134semak imbas

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>

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>

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!

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