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

Bagaimana untuk menggunakan sync.WaitGroup untuk melaksanakan semua goroutine?

PHPz
Lepaskan: 2024-02-09 11:40:09
ke hadapan
773 orang telah melayarinya

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)
}
Salin selepas log masuk

Penyelesaian

Hanya bergerak qui​​t <- 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()
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan