Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan 'kesilapan maut: semua goroutine sedang tidur - kebuntuan!' dengan penyegerakan.WaitGroup?

Bagaimana untuk Mengelakkan 'kesilapan maut: semua goroutine sedang tidur - kebuntuan!' dengan penyegerakan.WaitGroup?

Susan Sarandon
Susan Sarandonasal
2024-12-21 06:57:09385semak imbas

How to Avoid

Memahami "kesilapan maut: semua gorouti sedang tidur - kebuntuan!" dengan penyegerakan.WaitGroup

Apabila cuba menggunakan pakej penyegerakan.WaitGroup untuk mengurus gorouti serentak, adalah penting untuk mengelakkan "ralat maut: semua gorouti sedang tidur - kebuntuan!" yang ditakuti. Ralat ini timbul daripada penggunaan WaitGroup yang salah, khususnya apabila menghantar nilai melalui salinan dan bukannya rujukan.

Punca Kebuntuan

Isu ini berpunca daripada fakta bahawa apabila anda menghantar objek WaitGroup sebenar kepada fungsi doWork, Go membuat salinan nilai tersebut. Ini bermakna WaitGroup yang asal akan menambah pembilang sebanyak sepuluh panggilan Add() tanpa sebarang panggilan Done() yang sepadan. Sebaliknya, setiap salinan WaitGroup yang dihantar kepada goroutine hanya akan mempunyai satu panggilan Selesai() dan bilangan panggilan Add() yang hadir semasa WaitGroup disalin.

Penyelesaian: Lulus Penunjuk ke WaitGroup

Untuk menyelesaikan kebuntuan ini, adalah penting untuk menghantar penunjuk kepada WaitGroup dan bukannya objek WaitGroup itu sendiri. Ini memastikan bahawa semua goroutine merujuk WaitGroup yang sama dan apabila mereka memanggil Done(), kaunter pengurangan digunakan pada WaitGroup yang betul.

Kod Diubah Suai

Yang berikut kod yang diubah suai menunjukkan penggunaan penuding yang betul kepada WaitGroup:

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 mengguna pakai pendekatan ini, anda boleh menguruskan gorouti dengan yakin dengan WaitGroup, mengelakkan perangkap kebuntuan dan memastikan pelaksanaan serentak yang cekap.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan 'kesilapan maut: semua goroutine sedang tidur - kebuntuan!' 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