Rumah >pembangunan bahagian belakang >Golang >Mengapa Kod My Go Menghasilkan 'ralat maut: semua goroutine sedang tidur - kebuntuan!' Ralat dengan penyegerakan.WaitGroup?

Mengapa Kod My Go Menghasilkan 'ralat maut: semua goroutine sedang tidur - kebuntuan!' Ralat dengan penyegerakan.WaitGroup?

Linda Hamilton
Linda Hamiltonasal
2024-12-09 21:17:11272semak imbas

Why Does My Go Code Produce a

Ralat "Semua Goroutine Tidur" Semasa Menggunakan penyegerakan.WaitGroup

Dalam kod anda, anda menghadapi "ralat maut: semua goroutine adalah tidur - kebuntuan!" mesej. Ini berlaku kerana anda menghantar salinan WaitGroup kepada setiap goroutine dan bukannya rujukan kepada yang asal.

Seperti dalam dokumentasi, WaitGroup memerlukan anda menghantar penunjuk kepada pembolehubah dan bukannya pembolehubah itu sendiri. Apabila anda melepasi nilai WaitGroup sebenar, Go membuat salinan, menghasilkan berbilang kejadian WaitGroup dengan kiraan yang berbeza.

Kod yang dikemas kini hendaklah:

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()
}

Dengan menghantar penunjuk, semua goroutine rujuk WaitGroup yang sama. Apabila mereka memanggil Selesai(), ia mengurangkan kiraan dalam WaitGroup asal, menghasilkan gelagat yang dijangkakan.

Atas ialah kandungan terperinci Mengapa Kod My Go Menghasilkan 'ralat maut: semua goroutine sedang tidur - kebuntuan!' Ralat dengan penyegerakan.WaitGroup?. 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