Maison  >  Article  >  développement back-end  >  Analyse des instances de contrôle de concurrence : utilisez Go WaitGroup pour effectuer des tâches dans Golang

Analyse des instances de contrôle de concurrence : utilisez Go WaitGroup pour effectuer des tâches dans Golang

王林
王林original
2023-09-28 09:09:38796parcourir

并发控制实例解析:Golang中使用Go WaitGroup完成任务

Analyse des instances de contrôle de concurrence : l'utilisation de Go WaitGroup pour effectuer des tâches dans Golang nécessite des exemples de code spécifiques

Introduction :
En programmation simultanée, nous rencontrons souvent des situations où nous devons attendre qu'un groupe de tâches soit terminé avant de passer à la prochaine étape. Dans Golang, nous pouvons utiliser WaitGroup dans le package de synchronisation pour réaliser cette fonction. Cet article explique comment utiliser WaitGroup pour effectuer le contrôle de concurrence des tâches et donne des exemples de code spécifiques pour référence aux lecteurs.

  1. Comprendre le concept de base de WaitGroup
    WaitGroup est un outil de contrôle de concurrence très utile dans Golang, qui peut être utilisé pour attendre la fin d'un groupe de tâches. Lorsque nous devons attendre la fin d'un groupe de goroutines avant d'effectuer l'étape suivante, nous pouvons utiliser WaitGroup pour atteindre cet objectif.

WaitGroup a trois méthodes principales :

  • Add(delta int) : ajouter ou réduire le nombre de goroutines en attente à WaitGroup delta peut être un nombre positif ou négatif. Par exemple, un delta de 1 signifie ajouter une goroutine en attente, et un delta de -1 signifie terminer une goroutine en attente.
  • Done() : marque qu'une goroutine en attente a été terminée, équivalent à Add(-1).
  • Wait() : bloque et attend que toutes les goroutines en attente soient terminées.
  1. Exemple d'utilisation de WaitGroup pour implémenter le contrôle de concurrence des tâches
    Ce qui suit est un exemple simple pour montrer comment utiliser WaitGroup pour implémenter le contrôle de tâches simultanées.

Supposons que nous devions télécharger plusieurs fichiers et que chaque téléchargement de fichier nécessite un goroutine indépendant pour être traité. Notre objectif est de démarrer plusieurs goroutines en même temps pour télécharger ces fichiers, et de passer à l'étape suivante une fois tous les téléchargements terminés.

Tout d'abord, nous devons créer un objet WaitGroup et définir sa valeur initiale égale au nombre de fichiers à télécharger :

var wg sync.WaitGroup
const numFiles = 5

func main() {
    wg.Add(numFiles)
    // 启动goroutine执行下载任务
    for i := 0; i < numFiles; i++ {
        go downloadFile(i)
    }
    // 等待所有的下载任务完成
    wg.Wait()
    // 所有的下载任务已完成,进行下一步操作
    fmt.Println("All files have been downloaded!")
}

Dans la fonction downloadFile, nous avons besoin de la logique spécifique de téléchargement de fichiers. Lorsqu'un fichier est téléchargé, nous devons appeler la méthode Done de WaitGroup pour marquer que la goroutine est terminée :

func downloadFile(fileIndex int) {
    defer wg.Done()
    // 具体的文件下载逻辑
    fmt.Printf("Downloading file %d...
", fileIndex)
    time.Sleep(time.Second) // 模拟文件下载的耗时操作
    fmt.Printf("File %d has been downloaded.
", fileIndex)
}

Dans la logique de téléchargement, nous informons WaitGroup qu'une goroutine en attente a été terminée en appelant la méthode Done de WaitGroup. Lorsque toutes les goroutines appellent la méthode Done, la goroutine principale sera libérée après avoir appelé la méthode Wait et continuera à effectuer les opérations suivantes.

  1. Exemple de résultats d'exécution
    Lorsque nous exécutons le code ci-dessus, nous pouvons voir que le processus de téléchargement est effectué simultanément. Le téléchargement de chaque fichier est exécuté via différentes goroutines et leur ordre d'exécution n'est pas défini.

Les résultats de sortie sont les suivants :

Downloading file 0...
Downloading file 1...
Downloading file 2...
Downloading file 3...
Downloading file 4...
File 0 has been downloaded.
File 2 has been downloaded.
File 3 has been downloaded.
File 1 has been downloaded.
File 4 has been downloaded.
All files have been downloaded!

Vous pouvez voir que tous les fichiers sont téléchargés par la goroutine démarrée en même temps, et une fois tous les téléchargements terminés, la goroutine principale continue d'effectuer l'étape suivante et imprime " Tous les fichiers ont été téléchargés!" ".

Conclusion : 
En utilisant WaitGroup dans Golang, nous pouvons facilement implémenter le contrôle simultané des tâches. Cela améliore non seulement l'efficacité d'exécution du programme, mais simplifie également le processus d'écriture de tâches simultanées. J'espère que l'exemple de code de cet article sera utile aux lecteurs et les aidera à mieux maîtriser les compétences d'utilisation du contrôle de concurrence dans Golang.

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