Maison développement back-end Golang Combinaison efficace de Golang WaitGroup et du pool de coroutines

Combinaison efficace de Golang WaitGroup et du pool de coroutines

Sep 28, 2023 pm 05:22 PM
golang 协程池 waitgroup

Golang WaitGroup和协程池的高效结合

La combinaison efficace de Golang WaitGroup et du pool de coroutines nécessite des exemples de code spécifiques

Introduction :
Le langage Go est un langage qui met l'accent sur la programmation simultanée et permet une exécution simultanée efficace via la coroutine (goroutine). Dans certains scénarios où plusieurs tâches doivent être exécutées simultanément, la combinaison de WaitGroup et du pool de coroutines peut améliorer efficacement l'efficacité d'exécution et l'utilisation des ressources du programme. Cet article expliquera comment utiliser WaitGroup et le pool de coroutines dans Golang pour obtenir une programmation simultanée efficace et fournira des exemples de code spécifiques.

1. Introduction à WaitGroup
WaitGroup est un outil en langage Go utilisé pour attendre la fin d'un groupe de coroutines. Son code source est défini comme suit :

type WaitGroup struct {
    noCopy noCopy

    // 64位的值:高32位存储计数器,低32位存储等待计数器
    // 这个变量可以被原子操作加载和存储。
    // 在64位同步原语中,它必须在64位边界对齐。
    // 是一个强制的要求。
    state1 [3]uint32
}
Copier après la connexion

WaitGroup est généralement créé dans la goroutine principale, puis chaque sous-goroutine de la goroutine principale appelle la méthode Add pour augmenter le compteur, et une fois l'exécution terminée, la méthode Done est utilisé pour décrémenter le compteur. La goroutine principale peut attendre que le compteur revienne à zéro via la méthode Wait. L'exemple de code spécifique est le suivant :

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(3)

    go func() {
        defer wg.Done()
        fmt.Println("Task 1 executing")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Task 2 executing")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Task 3 executing")
    }()

    wg.Wait()
    fmt.Println("All tasks completed")
}
Copier après la connexion

Dans l'exemple ci-dessus, nous créons un objet WaitGroup puis incrémentons le compteur en appelant la méthode Add. Ensuite, nous avons créé trois sous-goroutines. Après l'exécution de chaque goroutine, le compteur est décrémenté via la méthode Done. Enfin, la goroutine principale attend que le compteur revienne à zéro en appelant la méthode Wait. Lorsque toutes les tâches sont terminées, le programme affichera « Toutes les tâches terminées ».

2. Introduction au pool de coroutines
En programmation simultanée, le pool de goroutines est un mode couramment utilisé. En créant un nombre fixe de goroutines et en leur répartissant uniformément les tâches, vous pouvez éviter les frais généraux liés à la création et à la destruction constantes de goroutines. En langage Go, vous pouvez utiliser des canaux pour implémenter des pools de coroutines. L'exemple de code spécifique est le suivant :

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        fib := fibonacci(j)
        fmt.Println("Worker", id, "finished job", j)
        results <- fib
    }
}

func fibonacci(n int) int {
    if n <= 1 {
        return n
    }

    return fibonacci(n-1) + fibonacci(n-2)
}

const numJobs = 5
const numWorkers = 3

func main() {
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    var wg sync.WaitGroup
    wg.Add(numWorkers)

    for w := 1; w <= numWorkers; w++ {
        go func(id int) {
            defer wg.Done()
            worker(id, jobs, results)
        }(w)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    wg.Wait()

    for r := 1; r <= numJobs; r++ {
        fmt.Println(<-results)
    }
}
Copier après la connexion

Dans l'exemple ci-dessus, nous avons défini la fonction de travail, qui lit les tâches en attente à partir du canal des tâches, puis exécute les tâches et envoie les résultats au canal des résultats. Nous avons créé un canal d'emplois et un canal de résultats pour mettre en œuvre la fonction du pool de coroutines en répartissant les tâches et en obtenant des résultats.

Dans la fonction principale, nous utilisons WaitGroup pour attendre que tous les travailleurs (goroutines) terminent l'exécution de la tâche. Ensuite, nous envoyons les tâches à exécuter vers le canal jobs et fermons le canal après exécution. Enfin, nous obtenons les résultats du calcul du canal de résultats et les publions.

3. Un cas de combinaison efficace de WaitGroup et du pool de coroutines
Ensuite, nous combinerons les deux concepts ci-dessus pour présenter comment utiliser efficacement WaitGroup et le pool de coroutines pour implémenter la programmation simultanée. L'exemple de code spécifique est le suivant :

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        fib := fibonacci(j)
        fmt.Println("Worker", id, "finished job", j)
        results <- fib
    }
}

func fibonacci(n int) int {
    if n <= 1 {
        return n
    }

    return fibonacci(n-1) + fibonacci(n-2)
}

const numJobs = 5
const numWorkers = 3

func main() {
    var wg sync.WaitGroup
    wg.Add(numWorkers)

    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    for w := 1; w <= numWorkers; w++ {
        go func(id int) {
            defer wg.Done()
            worker(id, jobs, results)
        }(w)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    go func() {
        wg.Wait()
        close(results)
    }()

    for r := range results {
        fmt.Println(r)
    }
}
Copier après la connexion

Dans l'exemple ci-dessus, nous avons créé un objet WaitGroup et incrémenté le compteur en appelant la méthode Add. Ensuite, nous avons créé une chaîne d'emplois et une chaîne de résultats pour répartir les tâches et obtenir des résultats. Nous créons un nombre fixe de travailleurs (goroutines) et utilisons la méthode Wait pour attendre qu'ils terminent leurs tâches.

Dans la fonction principale, nous envoyons les tâches à exécuter au canal jobs et fermons le canal après exécution. Nous démarrons ensuite une coroutine pour attendre que tous les travailleurs terminent leurs tâches et fermons le canal des résultats une fois terminés. Enfin, nous extrayons les résultats du calcul en les récupérant du canal des résultats.

Conclusion :
En combinant WaitGroup et le pool de coroutines, nous pouvons réaliser efficacement une programmation simultanée. En utilisant un WaitGroup pour attendre la fin de l'exécution d'un groupe de goroutines, vous pouvez vous assurer que la goroutine principale continue de s'exécuter une fois toutes les tâches terminées. En utilisant le pool de coroutines, nous pouvons éviter les frais généraux liés à la création et à la destruction fréquentes de goroutines et améliorer l'efficacité d'exécution et l'utilisation des ressources du programme.

Le calcul de la séquence de Fibonacci dans l'exemple de code n'est qu'un exemple de démonstration et peut être remplacé par d'autres tâches en fonction des besoins spécifiques des applications réelles. Grâce à WaitGroup et au pool de coroutines, nous pouvons mieux contrôler le nombre de tâches exécutées simultanément et utiliser efficacement les ressources informatiques.

Bien que le langage Go fournisse de riches outils et fonctionnalités de programmation simultanée, vous devez toujours être prudent lorsque vous les utilisez. Une utilisation appropriée de WaitGroup et du pool de coroutines peut nous aider à mieux gérer et planifier les goroutines et à réaliser une programmation simultanée efficace.

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment lire et écrire des fichiers en toute sécurité avec Golang ? Comment lire et écrire des fichiers en toute sécurité avec Golang ? Jun 06, 2024 pm 05:14 PM

Lire et écrire des fichiers en toute sécurité dans Go est crucial. Les directives incluent : Vérification des autorisations de fichiers Fermeture de fichiers à l'aide de reports Validation des chemins de fichiers Utilisation de délais d'attente contextuels Le respect de ces directives garantit la sécurité de vos données et la robustesse de vos applications.

Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Jun 06, 2024 am 11:21 AM

Comment configurer le pool de connexions pour les connexions à la base de données Go ? Utilisez le type DB dans le package base de données/sql pour créer une connexion à la base de données ; définissez MaxOpenConns pour contrôler le nombre maximum de connexions simultanées ; définissez MaxIdleConns pour définir le nombre maximum de connexions inactives ; définissez ConnMaxLifetime pour contrôler le cycle de vie maximum de la connexion ;

Comparaison des avantages et des inconvénients du framework Golang Comparaison des avantages et des inconvénients du framework Golang Jun 05, 2024 pm 09:32 PM

Le framework Go se distingue par ses hautes performances et ses avantages en matière de concurrence, mais il présente également certains inconvénients, tels qu'être relativement nouveau, avoir un petit écosystème de développeurs et manquer de certaines fonctionnalités. De plus, les changements rapides et les courbes d’apprentissage peuvent varier d’un cadre à l’autre. Le framework Gin est un choix populaire pour créer des API RESTful en raison de son routage efficace, de sa prise en charge JSON intégrée et de sa puissante gestion des erreurs.

Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Jun 05, 2024 pm 10:39 PM

Meilleures pratiques : créer des erreurs personnalisées à l'aide de types d'erreurs bien définis (package d'erreurs) fournir plus de détails consigner les erreurs de manière appropriée propager correctement les erreurs et éviter de masquer ou de supprimer les erreurs Wrap si nécessaire pour ajouter du contexte

Comment enregistrer les données JSON dans la base de données dans Golang ? Comment enregistrer les données JSON dans la base de données dans Golang ? Jun 06, 2024 am 11:24 AM

Les données JSON peuvent être enregistrées dans une base de données MySQL à l'aide de la bibliothèque gjson ou de la fonction json.Unmarshal. La bibliothèque gjson fournit des méthodes pratiques pour analyser les champs JSON, et la fonction json.Unmarshal nécessite un pointeur de type cible pour désorganiser les données JSON. Les deux méthodes nécessitent la préparation d'instructions SQL et l'exécution d'opérations d'insertion pour conserver les données dans la base de données.

Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Jun 06, 2024 pm 12:37 PM

La différence entre le framework GoLang et le framework Go se reflète dans l'architecture interne et les fonctionnalités externes. Le framework GoLang est basé sur la bibliothèque standard Go et étend ses fonctionnalités, tandis que le framework Go se compose de bibliothèques indépendantes pour atteindre des objectifs spécifiques. Le framework GoLang est plus flexible et le framework Go est plus facile à utiliser. Le framework GoLang présente un léger avantage en termes de performances et le framework Go est plus évolutif. Cas : gin-gonic (framework Go) est utilisé pour créer l'API REST, tandis qu'Echo (framework GoLang) est utilisé pour créer des applications Web.

Comment résoudre les problèmes de sécurité courants dans le framework Golang ? Comment résoudre les problèmes de sécurité courants dans le framework Golang ? Jun 05, 2024 pm 10:38 PM

Comment résoudre les problèmes de sécurité courants dans le framework Go Avec l'adoption généralisée du framework Go dans le développement Web, il est crucial d'assurer sa sécurité. Ce qui suit est un guide pratique pour résoudre les problèmes de sécurité courants, avec un exemple de code : 1. Injection SQL Utilisez des instructions préparées ou des requêtes paramétrées pour empêcher les attaques par injection SQL. Par exemple : constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

Quels sont les problèmes courants de gestion des dépendances dans le framework Golang ? Quels sont les problèmes courants de gestion des dépendances dans le framework Golang ? Jun 05, 2024 pm 07:27 PM

Problèmes courants et solutions dans la gestion des dépendances du framework Go : Conflits de dépendances : utilisez les outils de gestion des dépendances, spécifiez la plage de versions acceptée et recherchez les conflits de dépendances. Verrouillage du fournisseur : résolu par la duplication de code, le verrouillage des fichiers GoModulesV2 ou le nettoyage régulier du répertoire du fournisseur. Failles de sécurité : utilisez des outils d'audit de sécurité, choisissez des fournisseurs réputés, surveillez les bulletins de sécurité et maintenez les dépendances à jour.

See all articles