Maison >développement back-end >Golang >Programmation multithread Golang : explorez le potentiel illimité des Goroutines

Programmation multithread Golang : explorez le potentiel illimité des Goroutines

WBOY
WBOYoriginal
2023-07-17 14:13:201266parcourir

Programmation multithread Golang : explorer le potentiel illimité des Goroutines

Introduction :
À l'ère d'Internet hautement concurrente d'aujourd'hui, comment gérer efficacement un grand nombre de tâches parallèles est un défi important auquel sont confrontés les programmeurs. En tant que puissant langage de programmation typé statiquement, Golang est très respecté pour ses excellentes capacités de concurrence. Cet article présentera le concept de Goroutines dans Golang et montrera comment utiliser Goroutines pour réaliser une programmation multithread efficace à travers des exemples de code.

1. Le concept des Goroutines
Les Goroutines sont des unités d'exécution légères, similaires aux threads traditionnels, mais leur surcharge de création et de destruction est beaucoup plus petite. Les Goroutines peuvent s'exécuter simultanément avec d'autres Goroutines sans nécessiter de mécanisme de verrouillage explicite pour garantir un accès mutuellement exclusif aux ressources partagées. Cela rend la programmation multithread dans Golang plus simple et plus efficace.

Dans Golang, nous pouvons créer une nouvelle Goroutine via le mot-clé "go" et la laisser s'exécuter en arrière-plan. Voici un exemple de code :

package main

import (
    "fmt"
    "time"
)

func hello() {
    fmt.Println("Hello Goroutine!")
}

func main() {
    go hello() // 创建并运行一个Goroutine
    fmt.Println("Main Goroutine")
    time.Sleep(time.Second) // 等待一段时间以确保Goroutine有足够的时间完成执行
}

Dans le code, nous définissons une fonction hello, qui affichera "Bonjour Goroutine !" Dans la fonction principale, nous utilisons le mot-clé "go" pour créer et exécuter un nouveau Goroutine, qui exécutera la fonction hello en arrière-plan. En même temps, nous produisons "Main Goroutine" dans la Goroutine principale. Afin de garantir que la fonction hello dispose de suffisamment de temps pour s'exécuter, nous utilisons la fonction Sleep dans le package time pour faire une pause d'une seconde.

Les résultats de sortie sont les suivants :

Main Goroutine
Hello Goroutine!

Vous pouvez voir que la sortie de "Hello Goroutine!" est après "Main Goroutine", indiquant que les deux Goroutines sont exécutées en parallèle. C'est le pouvoir des Goroutines.

2. Utilisez Goroutines pour réaliser un calcul simultané
En plus de mettre en œuvre des tâches parallèles simples, Goroutines peut également être utilisé pour des tâches informatiques plus complexes. Ce qui suit prend le calcul de la séquence de Fibonacci comme exemple pour montrer comment utiliser Goroutines pour accélérer le processus de calcul.

package main

import (
    "fmt"
)

func fibonacci(n int) int {
    if n <= 0 {
        return 0
    }
    if n == 1 {
        return 1
    }
    return fibonacci(n-1) + fibonacci(n-2)
}

func fibonacciConcurrent(n int, c chan int) {
    c <- fibonacci(n)
}

func main() {
    n := 10
    c := make(chan int)
    for i := 0; i <= n; i++ {
        go fibonacciConcurrent(i, c)
    }
    for i := 0; i <= n; i++ {
        fmt.Println(<-c)
    }
}

Dans le code ci-dessus, nous définissons une fonction de Fibonacci pour calculer le nième nombre de la séquence de Fibonacci. Nous définissons également une fonction fibonacciConcurrent qui envoie les résultats du calcul à un canal c de type chan int. Dans la fonction principale, nous créons un canal c et utilisons une boucle for pour démarrer n Goroutines afin de calculer les n premiers nombres de la séquence de Fibonacci. Enfin, nous produisons les résultats du calcul en recevant les données du canal c.

En utilisant Goroutines pour le calcul parallèle, nous pouvons améliorer considérablement l'efficacité du calcul de la séquence de Fibonacci.

3. Planification et synchronisation des Goroutines
En programmation simultanée, la planification et la synchronisation sont des concepts très importants. La planification des Goroutines est automatiquement complétée par le système d'exécution Golang et les programmeurs n'ont pas à trop s'inquiéter. Mais dans certains cas, nous devrons peut-être contrôler manuellement la synchronisation des Goroutines.

L'exemple de code suivant montre comment utiliser le package de synchronisation dans Golang pour implémenter la synchronisation des Goroutines :

package main

import (
    "fmt"
    "sync"
)

func greet(name string, wg *sync.WaitGroup) {
    defer wg.Done() // Goroutine执行完毕后通知WaitGroup,表示该Goroutine已完成
    fmt.Printf("Hello, %s!
", name)
}

func main() {
    var wg sync.WaitGroup
    names := []string{"Alice", "Bob", "Charlie", "David"}

    for _, name := range names {
        wg.Add(1) // 增加WaitGroup的计数器
        go greet(name, &wg)
    }

    wg.Wait() // 等待所有Goroutines完成

    fmt.Println("All of the Goroutines have completed!")
}

Dans le code ci-dessus, nous définissons une fonction d'accueil qui imprime le paramètre de nom transmis sur la console et appelle wg.Done() informe WaitGroup que la Goroutine est terminée. Dans la fonction principale, nous avons créé une variable wg de type sync.WaitGroup et démarré plusieurs Goroutines à l'aide d'une boucle for. Après l'exécution de chaque Goroutine, le WaitGroup est averti en appelant wg.Done(), puis le Goroutine principal attend que toutes les Goroutines se terminent en appelant wg.Wait().

Résumé :
Cet article présente le concept de Goroutines dans Golang et montre comment utiliser Goroutines pour réaliser une programmation multithread efficace à travers des exemples de code. Les caractéristiques d'exécution légères et parallèles de Goroutines font de Golang un langage de programmation très adapté à la gestion de tâches simultanées. Avec une étude et une pratique approfondies de Golang, nous pouvons découvrir un potentiel plus illimité d’utilisation des Goroutines. J'espère que cet article pourra inspirer les lecteurs dans la programmation multithread.

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