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