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