Goroutines en français

Introduction

Les goroutines représentent une fonctionnalité fondamentale du langage de programmation Go, permettant l'exécution simultanée de fonctions et de méthodes. Bien qu’elles présentent certaines analogies avec les threads, leur fonctionnement et leur gestion sont fondamentalement différents.

Différences entre Goroutines et Threads

Voici quelques aspects clés qui distinguent les goroutines des threads classiques :
- Indépendance des threads : Les threads dépendent du système d'exploitation de l'ordinateur hôte, tandis que les goroutines n'ont pas cette contrainte.
- Efficacité des ressources : Les goroutines sont plus légères que les threads, ce qui signifie qu'elles consomment moins de ressources tout en restant efficaces.
- Absence de stockage local : Contrairement aux threads, les goroutines ne possèdent pas de stockage local spécifique, ce qui signifie qu'aucun ID unique ne leur est attribué.

Syntaxe des Goroutines

Pour lancer une goroutine, il suffit d'utiliser le mot-clé go suivi de l'appel d'une fonction préalablement définie :

func maFonction(parametre) typeRetour {
  // corps de la fonction
}

go maFonction() // Démarre la goroutine

Notez que pour que les goroutines s'exécutent, la fonction main() doit être définie et exécutée. La terminaison de main() entraîne la fin du programme, et par conséquent, l'arrêt de toutes les goroutines en cours.

Exemple de Goroutines

Considérons un exemple simple : nous allons définir une goroutine qui se charge d'imprimer un message. Dans la fonction main(), maGoroutine() est appelée avec le mot-clé go, créant ainsi une attente de 2 secondes grâce à time.Sleep() avant d'afficher le message suivant :

package main

import (
  "fmt"
  "time"
)

func maGoroutine() {
  fmt.Println("C'est ma première goroutine")
}

func main() {
  go maGoroutine() // Démmarre la goroutine
  time.Sleep(2 * time.Second) // Attente de 2 secondes
  fmt.Println("C'est la fonction principale")
}

L'exécution de ce code produira le résultat suivant :

C'est ma première goroutine
C'est la fonction principale

Un point important à retenir : lors du démarrage d'une goroutine, l'appel retourne immédiatement. Le programme ne patiente pas que la goroutine finisse son exécution. Après l'appel de la goroutine, le programme continue avec la ligne de code suivante. Les valeurs de retour de la goroutine sont également ignorées. La fonction time.Sleep() assure que la fonction principale reste active pendant l'exécution de maGoroutine(). Si cette temporisation n'était pas en place, le programme principal pourrait se terminer avant que la goroutine n'ait eu la chance de s’exécuter.

Exemple de Codebyte

Le code suivant définit une fonction imprimer() qui affiche une chaîne de caractères, d'abord appelée en tant que goroutine, puis comme fonction classique :

package main

import "fmt"

func imprimer(message string) {
  fmt.Println(message)
}

func main() {
  go imprimer("Bonjour de la goroutine !") // Appel en goroutine
  imprimer("Bonjour de la fonction régulière !") // Appel normal
}