Cara Anggun Menunggu Rutin Pergi Selesai
Dalam Go, keselarasan dicapai melalui goroutine, iaitu benang ringan yang berjalan serentak dengan rutin utama. Untuk memastikan program tidak keluar sebelum semua gorout menyelesaikan tugas mereka, adalah penting untuk menunggu dengan betul sehingga mereka selesai.
Menggunakan Saluran untuk Menyiapkan Isyarat
Satu pendekatan biasa untuk menunggu goroutine ialah menggunakan saluran boolean. Apabila goroutine menyelesaikan tugasnya, ia menghantar nilai sebenar kepada saluran dan rutin utama menunggu nilai itu dengan menerima daripada saluran.
func do_stuff(done chan bool) { fmt.Println("Doing stuff") done <- true } func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done }
Mengapa <-done berfungsi?
<-selesai ialah operasi penerimaan menyekat. Ini bermakna bahawa rutin utama akan menunggu sehingga nilai dihantar ke saluran selesai. Memandangkan goroutine do_stuff secara eksplisit menghantar nilai sebenar kepada saluran apabila ia selesai, rutin utama akan menerimanya dan meneruskan pelaksanaan.
Apa yang berlaku jika kita menyahkomen baris terakhir?
Jika kami menyahkomen baris terakhir, kami mendapat ralat kebuntuan kerana saluran kosong dan tiada goroutine lain menghantar nilai kepadanya. Oleh itu, rutin utama akan menunggu tanpa terhingga untuk nilai diterima, mengakibatkan kebuntuan.
Pendekatan Alternatif Menggunakan Pakej Penyegerakan
Untuk senario konkurensi yang lebih kompleks, penyegerakan pakej menyediakan mekanisme penyegerakan yang mudah. Contohnya, jika anda perlu menyelaraskan satu siri fungsi jangka panjang, coretan kod berikut menunjukkan cara menggunakan penyegerakan. Jenis WaitGroup:
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { longOp() wg.Done() }() } // will wait until wg.Done is called 10 times // since we made wg.Add(1) call 10 times wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("long op done") }
Dalam contoh ini, WaitGroup memastikan bahawa rutin utama tidak keluar sehingga semua goroutine memanggil wg.Selesai.
Atas ialah kandungan terperinci Bagaimana dengan Anggun Menunggu Rutin Pergi Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!