Ketidakpastian Perintah Pelaksanaan Goroutine
Dalam coretan kod yang disediakan, susunan pelaksanaan untuk kedua-dua goroutin adalah bukan deterministik. Output menunjukkan bahawa goroutine kedua dilaksanakan terlebih dahulu, walaupun ia dimulakan selepas yang pertama. Tingkah laku ini disebabkan oleh sifat serentak goroutine, yang bermaksud bahawa mereka melaksanakan secara bebas antara satu sama lain.
Mekanisme Penyegerakan dalam Goroutines
Untuk mengawal susunan pelaksanaan goroutine , anda boleh menggunakan mekanisme penyegerakan yang disediakan oleh Go, seperti sebagai:
Saluran: Anda boleh menggunakan saluran untuk menyegerakkan pelaksanaan goroutin. Saluran ialah saluran komunikasi yang membolehkan goroutine menghantar dan menerima data. Dalam contoh yang diubah suai di bawah, saluran digunakan untuk menyekat goroutine utama sehingga goroutine pertama menyelesaikan pelaksanaannya sebelum goroutine kedua dimulakan.
func main() { c := make(chan int) go sum([]int{1, 2, 3}, c) // Use the channel to block until it receives a send x := <-c fmt.Println(x) // Then execute the next routine go sum([]int{4, 5, 6}, c) x = <-c fmt.Println(x) }
Kumpulan Tunggu: Kumpulan tunggu ialah satu lagi mekanisme penyegerakan yang membolehkan anda menunggu beberapa goroutine untuk menyelesaikan pelaksanaan sebelum meneruskan. Dalam contoh berikut, kumpulan tunggu digunakan untuk memastikan semua goroutine selesai sebelum goroutine utama keluar.
func sum(a []int, c chan int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("summing: ", a) total := 0 for _, v := range a { total += v } // Send total to c c <- total } func main() { c := make(chan int) wg := new(sync.WaitGroup) // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel go func() { // Increment the wait group, and pass it to the sum func to decrement it when it is complete wg.Add(1) go sum([]int{1, 2, 3}, c, wg) // Wait for the above call to sum to complete wg.Wait() // And repeat... wg.Add(1) go sum([]int{4, 5, 6}, c, wg) wg.Wait() // All calls are complete, close the channel to allow the program to exit cleanly close(c) }() // Range of the channel for theSum := range c { x := theSum fmt.Println(x) } }
Dengan menggunakan mekanisme penyegerakan ini, anda boleh mengawal susunan pelaksanaan goroutine dan memastikan bahawa urutan operasi yang diingini dikekalkan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengawal Perintah Pelaksanaan Goroutine dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!