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
}