Maison  >  Article  >  développement back-end  >  Comment utiliser sync.WaitGroup pour exécuter toutes les goroutines ?

Comment utiliser sync.WaitGroup pour exécuter toutes les goroutines ?

PHPz
PHPzavant
2024-02-09 11:40:09724parcourir

Comment utiliser sync.WaitGroup pour exécuter toutes les goroutines ?

L'éditeur PHP Apple vous présente une méthode pratique pour exécuter toutes les goroutines - sync.WaitGroup. Dans le langage Go, goroutine est un thread léger qui peut effectuer plusieurs tâches en même temps. Cependant, nous devons parfois attendre que toutes les goroutines soient terminées avant de passer à l'étape suivante. À l’heure actuelle, sync.WaitGroup est utile. Il fournit un moyen simple et efficace d'attendre la fin de toutes les goroutines, garantissant ainsi le bon ordre d'exécution du programme. Ensuite, nous présenterons en détail comment utiliser sync.WaitGroup pour implémenter cette fonction.

Contenu de la question

Actuellement, je pousse toutes les valeurs vers un canal, je les lis et je calcule leur carré. Je veux éviter d'utiliser time.sleep(2000 * time.millisecond) car il bloque l'exécution pendant 2 secondes, je veux plutôt que chaque goroutine soit traitée et attende son exécution, puis quitte le programme. Je viens de quitter Golang, alors je pose maintenant cette question fondamentale :(. Quelqu'un peut-il m'aider à résoudre ce problème ?

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

Solution

Déplacez-vous simplement qui​​t jusqu'à la fin de la première goroutine

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

C'est close(ch) une autre façon de dire qu'il n'y a plus de données

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
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer