Menyelesaikan Kebuntuan dalam Go Goroutines
Dalam pengaturcaraan serentak, kebuntuan berlaku apabila berbilang goroutin menunggu selama-lamanya untuk satu sama lain menyelesaikan operasi, dengan berkesan menghentikan program. Artikel ini menangani kebuntuan khusus yang ditemui dalam konkurensi Go, seperti yang diterangkan dalam soalan asal:
<code class="go">package main import ( "fmt" "time" ) func producer(ch chan int, d time.Duration, num int) { for i := 0; i < num; i++ { ch <- i time.Sleep(d) } } func main() { ch := make(chan int) go producer(ch, 100*time.Millisecond, 2) go producer(ch, 200*time.Millisecond, 5) for { fmt.Println(<-ch) } close(ch) }</code>
Kod ini mencetuskan ralat kebuntuan disebabkan faktor berikut:
Penyelesaian: Penamatan Terselaras
Untuk mengelakkan kebuntuan, pengeluar mesti diselaraskan kepada isyarat siap, dan saluran mesti ditutup oleh pengeluar terakhir. Berikut ialah penyelesaian yang cekap menggunakan penyegerakan.WaitGroup untuk penyelarasan:
<code class="go">func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < num; i++ { ch <- i time.Sleep(d) } } func main() { wg := &sync.WaitGroup{} ch := make(chan int) wg.Add(1) go producer(ch, 100*time.Millisecond, 2, wg) wg.Add(1) go producer(ch, 200*time.Millisecond, 5, wg) go func() { wg.Wait() close(ch) }() for v := range ch { fmt.Println(v) } }</code>
Dalam penyelesaian ini:
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan dalam Go Goroutines Apabila Pengeluar Berumur Pendek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!