Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-09 11:40:09
avant
750 Les gens l'ont consulté

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)
}
Copier après la connexion

Solution

Déplacez-vous simplement qui​​t <- true 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()
}
Copier après la connexion

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!