Dalam Go, mengurus konkurensi dengan penyegerakan.WaitGroup dan saluran adalah amalan biasa. Walau bagaimanapun, bagi pemula, ia boleh membingungkan apabila program terhenti walaupun memenuhi jangkaan penyiapan goroutine. Mari kita mendalami kes tertentu dan membongkar isu asas.
Seorang pembangun melaksanakan program menggunakan penyegerakan.WaitGroup dan saluran (fetchedSymbols) untuk mendapatkan semula senarai sebut harga saham secara serentak. Sementara program menunggu goroutine selesai, ia enggan ditamatkan.
Punca masalah terletak pada peninggalan menutup saluran fetchedSymbols. Apabila melelakan saluran ini dalam fungsi utama, program menjadi disekat selama-lamanya. Dalam kes ini, penutupan saluran hendaklah dimulakan setelah selesai semua goroutine.
Untuk memastikan pelaksanaan program lancar, pembangun memperkenalkan goroutine pembantu yang memantau penyegerakan.WaitGroup dan pencetus penutupan fetchedSymbols setelah semua goroutine telah menyelesaikan tugas mereka. Ini menghapuskan gelagat menyekat dan membenarkan program keluar dengan anggun.
<code class="go">go func() { wg.Wait() close(fetchedSymbols) }() for response := range fetchedSymbols { fmt.Println("fetched " + response) }</code>
Dengan melaksanakan penyelesaian ini, program kini keluar dengan anggun selepas berjaya memuat turun semua sebut harga saham, dengan cekap menggunakan konkurensi Go ciri.
Atas ialah kandungan terperinci Mengapa Program My Go Terhenti Walaupun Semua Goroutine Telah Selesai? Panduan untuk menyegerakkan.WaitGroup dan Penyekatan Saluran.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!