Penempatan Sisipan WaitGroup untuk Penyegerakan Goroutine
Dalam Go, jenis penyegerakan.WaitGroup memudahkan penyegerakan antara goroutine dengan menjejaki bilangan aktif gorouti dan menunggu sehingga semua gorouti selesai pelaksanaannya sebelum meneruskan lebih jauh. Peletakan panggilan wg.Add() dan wg.Done() yang betul adalah penting untuk memastikan kelakuan yang betul.
Pertimbangkan kod berikut:
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i = 0; i < 100; i++{ go func(){ wg.Add(1) // wrong place atomic.AddInt32(&v,1) wg.Done() } } wg.Wait() fmt.Println(v)</code>
Dalam contoh ini, wg.Add( 1) tersilap diletakkan dalam fungsi tanpa nama. Peletakan yang salah ini boleh menyebabkan nilai v yang tidak konsisten, selalunya kurang daripada 100.
Punca percanggahan ini terletak pada sifat serentak goroutin. Apabila diletakkan dalam goroutine, wg.Add(1) boleh dijalankan serentak dengan wg.Done(), menyebabkan wg.Wait() disambung semula lebih awal dan memandang rendah bilangan goroutine yang telah siap.
Untuk menangani isu ini, wg.Add(1) hendaklah diletakkan dalam gelung for sebelum melancarkan setiap goroutine:
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i = 0; i < 100; i++{ wg.Add(1) go func(){ atomic.AddInt32(&v,1) wg.Done() } } wg.Wait() fmt.Println(v)</code>
Pelarasan ini memastikan wg.Wait() akan menyekat sehingga semua panggilan wg.Done() telah dibuat, membenarkan v mencerminkan dengan tepat bilangan goroutine yang telah siap.
Ringkasnya, sentiasa letakkan wg.Add() sebelum melancarkan goroutine dan wg.Done() sebaik sahaja goroutine melengkapkan pelaksanaannya untuk memastikan penyegerakan yang betul dan hasil yang boleh dipercayai pengiraan.
Atas ialah kandungan terperinci Di Mana Anda Harus Letakkan `wg.Add()` dan `wg.Done()` untuk Penyegerakan Goroutine yang Betul dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!