Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Go's sync.WaitGroup?

Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Go's sync.WaitGroup?

Patricia Arquette
Lepaskan: 2024-12-07 13:34:13
asal
887 orang telah melayarinya

How to Avoid Deadlocks When Using Go's sync.WaitGroup?

Menyelesaikan Masalah Ralat Kebuntuan Semasa Menggunakan penyegerakan.WaitGroup

Apabila bekerja dengan rutin Go serentak, pengendalian penyegerakan adalah penting untuk mengelakkan kebuntuan. Satu senario sedemikian berlaku apabila cuba menyelaraskan berbilang goroutin dan menunggu untuk selesai menggunakan penyegerakan.WaitGroup. Walau bagaimanapun, kadangkala, anda mungkin menghadapi ralat: "ralat maut: semua gorouti sedang tidur - kebuntuan!".

Ralat ini berpunca daripada penggunaan penyegerakan yang salah.WaitGroup. Dalam coretan kod yang disediakan:

import "sync"

func doWork(wg sync.WaitGroup) error {
    defer wg.Done()
    // Do some heavy lifting... request URL's or similar
    return nil
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
    wg.Wait()
}
Salin selepas log masuk

Isunya terletak pada menghantar objek penyegerakan.WaitGroup terus ke fungsi doWork. Apabila menghantar nilai mengikut nilai, salinan objek dibuat, yang membawa kepada gelagat yang tidak dijangka.

Pembetulan melibatkan menghantar penuding kepada penyegerakan.WaitGroup sebaliknya:

import "sync"

func doWork(wg *sync.WaitGroup) error {
    defer wg.Done()
    // Do some heavy lifting... request URL's or similar
    return nil
}

func main() {
    wg := &sync.WaitGroup{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
    wg.Wait()
}
Salin selepas log masuk

Oleh melepasi penunjuk, setiap goroutine akan merujuk objek WaitGroup yang sama, memastikan Selesai() dipanggil pada contoh yang dimaksudkan. Ini menyelesaikan isu kebuntuan dan membenarkan atur cara untuk melaksanakan tanpa ralat.

Ingat, apabila menggunakan penyegerakan.WaitGroup untuk menyegerakkan goroutin, sentiasa hantar penunjuk ke objek untuk memastikan tingkah laku yang konsisten dan mengelakkan kemungkinan kebuntuan.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Go's 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