Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan sync.WaitGroup untuk melaksanakan semua goroutine?

Bagaimana untuk menggunakan sync.WaitGroup untuk melaksanakan semua goroutine?

PHPz
PHPzke hadapan
2024-02-09 11:40:09768semak imbas

Bagaimana untuk menggunakan sync.WaitGroup untuk melaksanakan semua goroutine?

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.

Kandungan soalan

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)
}

Penyelesaian

Hanya bergerak qui​​t 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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam