Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencegah Kebuntuan dalam Go Concurrency dengan sync.WaitGroup?

Bagaimana untuk Mencegah Kebuntuan dalam Go Concurrency dengan sync.WaitGroup?

Barbara Streisand
Lepaskan: 2024-10-25 08:53:02
asal
311 orang telah melayarinya

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

Menyelesaikan Kebuntuan Goroutines

Dalam senario ini, anda telah mengalami ralat jalan buntu dalam kod serentak Go anda. Mari kita mendalami isu ini dan menyediakan penyelesaian yang cekap.

Ralat berlaku disebabkan oleh ketidakpadanan antara gelagat pengeluar dan pengguna anda. Pengeluar anda, yang dilaksanakan dalam fungsi pengeluar, menghantar nilai pada saluran ch untuk tempoh terhad. Walau bagaimanapun, pengguna, yang hadir dalam fungsi utama anda, berjalan selama-lamanya, tanpa henti cuba menerima nilai daripada ch.

Untuk menyelesaikan kebuntuan ini, anda perlu memastikan bahawa pengguna menghormati penyempurnaan pengeluar. Ini bermakna pengguna harus ditamatkan secara automatik apabila pengeluar selesai menghantar nilai.

Satu pendekatan yang berkesan ialah menggunakan penyegerakan.WaitGroup untuk menyelaraskan pengeluar. Kumpulan menunggu membolehkan anda menjejaki kemajuan pengeluar dan menunggu mereka menyelesaikan tugas mereka sebelum menutup saluran. Berikut ialah versi kod anda yang dipertingkatkan:

<code class="go">func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}</code>
Salin selepas log masuk

Dalam kod yang dikemas kini ini, sync.WaitGroup digunakan untuk menjejaki bilangan pengeluar aktif. Pengeluar memanggil wg.Done() untuk mengurangkan kumpulan menunggu apabila mereka selesai menghantar nilai. Goroutine utama menunggu untuk semua pengeluar selesai menggunakan wg.Wait(), dan kemudian menutup saluran ch.

Dengan menggunakan sync.WaitGroup, anda mewujudkan mekanisme penyelarasan yang membolehkan pengguna anda menghormati status penyiapan daripada pengeluar, dengan berkesan menyelesaikan ralat kebuntuan.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Kebuntuan dalam Go Concurrency dengan sync.WaitGroup?. 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