Penggunaan penyegerakan yang optimum.WaitGroup dengan Fungsi Luaran
Isu:
Melaksanakan penyegerakan. WaitGroup dengan fungsi luaran menyebabkan kebuntuan apabila cuba mencetak nombor 1 hingga 11. Khususnya, ralat berlaku pada baris wg.Wait().
Penyelesaian 1 (Pendekatan Salah):
Menetapkan wg.Add(1) dan bukannya 2 ialah penyelesaian yang salah, kerana ia tidak menangani isu asas.
Penyelesaian 2 (Pendekatan Diperbaik):
Ubah suai kod seperti berikut:
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) wg.Done() }() wg.Wait() //deadlock here } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } wg.Done() }</code>
Penjelasan:
Mengirim alamat wg ke Print memastikan bahawa contoh WaitGroup yang sama sedang dimanipulasi. Mengalih keluar wg daripada tandatangan fungsi Cetak menghapuskan keperluan untuk fungsi mengetahui tentang WaitGroup luaran.
Kesimpulan:
Penyelesaian kedua ialah pendekatan yang lebih mantap yang mengelakkan kebuntuan dan mengekalkan kebebasan fungsi Cetak daripada wg.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!