Golang sync.WaitGroup Never Completes
Kod yang disediakan menunjukkan konkurensi dengan mengambil senarai URL dan memuat turun dan menyimpan fail secara bersyarat ke fail sistem. Goroutine utama menunggu untuk semua fail diambil menggunakan penyegerakan.WaitGroup. Walau bagaimanapun, program gagal untuk keluar walaupun selepas melengkapkan semua permintaan.
Untuk memahami isu ini, pertimbangkan kefungsian WaitGroup. Ia mengekalkan kiraan goroutin yang melaksanakan. Jika kiraan pernah mencecah sifar, kumpulan tunggu akan kembali serta-merta, menunjukkan semua goroutine telah menyelesaikan pelaksanaan.
Dalam kod yang diberikan, kaedah WaitGroup's Add digunakan untuk menambah kiraan, manakala kaedah Done digunakan untuk mengurangkannya . Jika kaedah Tambah dipanggil lebih banyak kali daripada kaedah Selesai, atau sebaliknya, WaitGroup tidak akan mencapai sifar, menyebabkan goroutine utama menunggu selama-lamanya.
Terdapat dua ralat dalam kod yang disediakan:
func main() { ... go downloadFromURL(url, &wg) ... }
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
Dengan pembetulan ini dilaksanakan, WaitGroup akan berfungsi dengan betul, mengurangkan kiraannya apabila gorouti melengkapkan tugasan, akhirnya membawa kepada kejayaan keluar goroutine utama.
Atas ialah kandungan terperinci Mengapa My Go tidak menyegerakkan.WaitGroup Pernah Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!