Menutup Saluran Selepas Goroutine Selesai
Apabila bekerja dengan goroutin dan saluran dalam Go, selalunya perlu untuk menentukan bila semua goroutine telah selesai melaksanakan dan menutup saluran dengan sewajarnya. Dua pendekatan biasa dibentangkan dalam soalan: menutup saluran secara eksplisit selepas bertelur goroutine dan menggunakan pengiraan benang.
Penutupan Saluran Eksplisit
Pendekatan pertama melibatkan penutupan saluran selepas semua goroutine dicipta. Walau bagaimanapun, ada kemungkinan saluran itu ditutup lebih awal, menghalang goroutine daripada menghantar keputusannya.
Pengiraan Benang
Dalam pendekatan kedua, kiraan benang dikekalkan, dan saluran ditutup apabila kiraan mencapai sifar. Walaupun berfungsi, ia bergantung pada panggilan tidur atau menunggu sibuk, yang boleh menjadi tidak cekap.
Penyelesaian Sync.WaitGroup
Cara yang lebih cekap dan boleh dipercayai untuk menyelesaikan tugas ini ialah untuk menggunakan jenis penyegerakan.WaitGroup. WaitGroup membenarkan menunggu pada bilangan tugasan tertentu, tanpa mengira susunan penyelesaiannya. Mengubah suai contoh asal untuk menggunakan WaitGroup akan kelihatan seperti ini:
import ( "sync" ) func main() { var wg sync.WaitGroup for i := 0; i <= 10; i++ { wg.Add(1) go func() { result := calculate() c <- result wg.Done() }() } // Close the channel when all goroutines are finished go func() { wg.Wait() close(c) }() for result := range c { all_result = append(all_result, result...) } }
Pendekatan ini membolehkan goroutine menyelesaikan tugas mereka sebelum menutup saluran, memastikan semua mesej yang dijangka diterima.
Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Go dengan Amanah Selepas Semua Goroutine Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!