Editor PHP Apple memperkenalkan anda kaedah praktikal untuk melaksanakan semua goroutine - sync.WaitGroup. Dalam bahasa Go, goroutine ialah benang ringan yang boleh melaksanakan berbilang tugas pada masa yang sama. Walau bagaimanapun, kadangkala kita perlu menunggu semua goroutine selesai sebelum meneruskan ke langkah seterusnya. Pada masa ini, sync.WaitGroup berguna. Ia menyediakan cara yang mudah dan berkesan untuk menunggu semua goroutine selesai, memastikan susunan pelaksanaan program yang betul. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan sync.WaitGroup untuk melaksanakan fungsi ini.
Pada masa ini saya sedang menolak semua nilai ke saluran dan membaca daripadanya dan mengira kuasa duanya.
Saya ingin mengelak daripada menggunakan time.sleep(2000 * time.millisecond)
kerana ia menyekat pelaksanaan selama 2 saat, sebaliknya saya mahu setiap goroutine diproses dan menunggu pelaksanaannya, kemudian keluar dari program. Saya baru berpindah dari golang jadi sekarang bertanya soalan asas ini :(. Bolehkah sesiapa membantu saya dengan ini?
package main import ( "fmt" "sync" "time" ) func doSquare(num int) int { return num * num } var wg sync.WaitGroup func main() { wg.Add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } }() go func() { for { select { case x := <-ch: fmt.Println(doSquare(x)) // return case <-quit: wg.Done() default: // fmt.Println("---") // do something } } }() quit <- true wg.Wait() time.Sleep(2000 * time.Millisecond) }
Hanya bergerak quit <- true
ke penghujung goroutine pertama
func main() { wg.add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } quit <- true }() go func() { for { select { case x := <-ch: fmt.println(dosquare(x)) // return case <-quit: wg.done() return default: // fmt.println("---") // do something } } }() wg.wait() }
Ini close(ch)
cara lain untuk mengatakan tiada lagi data
func main() { st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) // improve concurrency by `ch := make(chan int, 100)` go func() { for i := range st { ch <- i } close(ch) }() go func() { for x := range ch { fmt.Println(doSquare(x)) } quit <- true }() <-quit }
Atas ialah kandungan terperinci Bagaimana untuk menggunakan sync.WaitGroup untuk melaksanakan semua goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!