Maison  >  Article  >  développement back-end  >  Maîtriser la programmation multithread et le contrôle de concurrence en langage Go

Maîtriser la programmation multithread et le contrôle de concurrence en langage Go

PHPz
PHPzoriginal
2023-11-30 10:29:22463parcourir

Maîtriser la programmation multithread et le contrôle de concurrence en langage Go

Maîtriser la programmation multithread et le contrôle de concurrence en langage Go

Résumé : Cet article présente les concepts de base et l'utilisation de la programmation multithread et du contrôle de concurrence en langage Go. Grâce à l'introduction et à l'analyse d'exemples d'utilisation de goroutine et de canal en langage Go, il peut aider les lecteurs à maîtriser la programmation multithread et les compétences de contrôle de concurrence en langage Go pour améliorer les performances et l'efficacité du programme.

  1. Introduction

Avec le développement du matériel informatique, les processeurs multicœurs sont devenus le courant dominant des ordinateurs modernes. Pour exploiter pleinement le potentiel des processeurs multicœurs, les développeurs doivent implémenter un contrôle de concurrence via une programmation multithread. Cependant, les méthodes de programmation multithread traditionnelles provoquent souvent une série de problèmes, tels que des blocages, des conditions de concurrence, etc. Afin de résoudre ces problèmes, le langage Go fournit une méthode de programmation multithread et de contrôle de concurrence simple et puissante.

  1. Concepts de base de Goroutine et du canal

Goroutine en langage Go est un thread léger qui peut exécuter des tâches simultanément dans le programme. Par rapport aux threads traditionnels, goroutine a très peu de frais de démarrage et de destruction et peut atteindre efficacement une concurrence à grande échelle. Dans le langage Go, vous pouvez démarrer une goroutine via le mot-clé go, par exemple :

go func() {
    // 任务代码
}()

channel est un mécanisme de communication utilisé pour transmettre des données entre goroutines. Un canal peut être considéré comme un canal à travers lequel une goroutine peut envoyer et recevoir des données. Dans le langage Go, vous pouvez utiliser le mot-clé make pour créer un canal, par exemple :

ch := make(chan int)
  1. Exemples d'utilisation de Goroutine

Ce qui suit est un exemple simple pour illustrer comment utiliser goroutine pour la programmation simultanée. Supposons qu'il existe une fonction qui calcule les nombres premiers. Les calculs parallèles peuvent être effectués de la manière suivante :

func isPrime(n int) bool {
    if n < 2 {
        return false
    }
    for i := 2; i * i <= n; i++ {
        if n % i == 0 {
            return false
        }
    }
    return true
}

func main() {
    num := 100
    ch := make(chan int)

    for i := 2; i <= num; i++ {
        go func(n int) {
            if isPrime(n) {
                ch <- n
            }
        }(i)
    }

    for i := 2; i <= num; i++ {
        fmt.Println(<-ch)
    }
}

Dans le code ci-dessus, créez d'abord un canal ch pour recevoir les nombres premiers calculés. Utilisez ensuite une boucle for pour démarrer plusieurs goroutines afin de calculer les nombres premiers en même temps. Une fois que chaque goroutine a terminé le calcul, les résultats sont envoyés au canal ch. Enfin, lisez et imprimez les nombres premiers du canal ch via une boucle for. En utilisant goroutine, plusieurs nombres premiers peuvent être calculés efficacement simultanément et l'efficacité d'exécution du programme peut être améliorée.

  1. Contrôle de concurrence

En plus d'utiliser goroutine pour implémenter la programmation simultanée, le langage Go fournit également certains mécanismes de contrôle de concurrence. Par exemple, vous pouvez utiliser le type Mutex dans le mot-clé sync pour implémenter un verrou mutex afin de protéger l'accès aux ressources partagées. Un exemple est le suivant :

import "sync"

var count int
var mutex sync.Mutex

func increment() {
    mutex.Lock()
    count++
    mutex.Unlock()
}

func main() {
    var wg sync.WaitGroup
    num := 100

    wg.Add(num)
    for i := 0; i < num; i++ {
        go func() {
            defer wg.Done()
            increment()
        }()
    }

    wg.Wait()
    fmt.Println(count)
}

Dans le code ci-dessus, un nombre de variables partagées et un mutex de verrouillage mutex sont d'abord définis. Utilisez ensuite plusieurs goroutines pour appeler simultanément la fonction d'incrémentation, qui utilise un mutex pour protéger l'accès au nombre. Enfin, WaitGroup est utilisé pour attendre que toutes les goroutines soient exécutées et imprimer le résultat du décompte. En utilisant des verrous mutex, vous pouvez garantir que l'accès aux ressources partagées est sécurisé et éviter les conditions de concurrence.

  1. Résumé

Cet article présente les concepts de base et l'utilisation de la programmation multithread et du contrôle de concurrence dans le langage Go. Grâce à l'introduction et à l'analyse d'exemples d'utilisation de goroutine et de canal en langage Go, il peut aider les lecteurs à maîtriser la programmation multithread et les compétences de contrôle de concurrence en langage Go pour améliorer les performances et l'efficacité du programme. Dans le même temps, il introduit également l'utilisation de mécanismes de contrôle de concurrence tels que les verrous mutex pour garantir un accès sécurisé aux ressources partagées. La maîtrise de la programmation multithread et du contrôle de concurrence du langage Go sera très utile pour développer des applications hautes performances et à haute concurrence.

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