Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?
Menunggu Selesai Rutin Pergi
Dalam Go, amalan biasa ialah menggunakan gorout untuk melaksanakan tugasan serentak. Untuk memastikan program utama menunggu semua goroutine selesai sebelum keluar, adalah penting untuk melaksanakan mekanisme penyegerakan yang betul.
Satu pendekatan, seperti yang dinyatakan dalam soalan, melibatkan penggunaan saluran boolean (selesai):
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 <-selesai Berfungsi:
Operasi <-selesai ialah penerimaan saluran menyekat. Ia menunggu sehingga nilai dihantar pada saluran selesai. Dalam kod yang disediakan, do_stuff menghantar benar pada saluran selepas tugasan selesai, menyebabkan operasi <-selesai dalam utama berjaya.
Kebuntuan daripada Menyahkomen Baris Terakhir:
Menyahkomen baris terakhir dalam utama membawa kepada kebuntuan:
func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done // <-done }
Detik ini Operasi <-dilakukan cuba membaca dari saluran kosong tanpa sebarang nilai penghantaran goroutine kepadanya. Akibatnya, atur cara itu terhenti dalam kebuntuan.
Kaedah Penyegerakan Alternatif Menggunakan Pakej penyegerakan:
Untuk senario yang lebih kompleks, pakej penyegerakan menawarkan primitif penyegerakan alternatif. Dalam kod yang disediakan, sync.WaitGroup boleh menjejaki penyiapan goroutine dengan berkesan:
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 (10 goroutines finish) wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("long op done") }
Penggunaan penyegerakan.WaitGroup memastikan yang utama menunggu sehingga kesemua 10 goroutine selesai sebelum keluar dari program.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!