Aller au contenu

Goroutines et concurrence#

Introduction à la concurrence et aux goroutines#

  • La concurrence en informatique fait référence à l'habileté d'un système à exécuter plusieurs tâches en apparente simultanéité.
  • Go offre un modèle de concurrence basé sur les goroutines et les canaux.
  • Les goroutines sont des fonctions qui peuvent être exécutées en parallèle avec d'autres.
  • En Go, la création d'une goroutine est simple et peu coûteuse en ressources comparée à la création d'un thread.

Création et utilisation des goroutines#

  • Pour créer une goroutine, on utilise le mot-clé go avant l'appel d'une fonction. Exemple : go maFonction()
  • Chaque goroutine a sa propre pile, qui grandit et rétrécit au besoin.
  • Le scheduler de Go gère l'exécution des goroutines, le développeur n'a pas besoin de se soucier explicitement de leur planification.
  • Cependant, le contrôle des goroutines reste délicat, surtout lorsqu'il s'agit de synchronisation.

Gestion des goroutines avec sync.WaitGroup#

  • Le package sync de Go fournit une structure WaitGroup pour attendre qu'un ensemble de goroutines ait terminé son exécution.
  • Add(int) ajoute le nombre spécifié de goroutines à attendre.
  • Done() est appelé par chaque goroutine lorsqu'elle a terminé son travail.
  • Wait() bloque l'exécution jusqu'à ce que toutes les goroutines aient terminé.

Parallélisme vs Concurrence#

  • La concurrence est une propriété du code ; le parallélisme, une propriété de l'exécution.
  • La concurrence permet de structurer le programme pour qu'il puisse fonctionner de manière indépendante.
  • Le parallélisme est l'exécution simultanée de plusieurs tâches. En Go, cela est rendu possible par les goroutines sur des systèmes à multiprocesseurs.

Comparaison des goroutines avec les threads#

  • Les goroutines sont plus légères que les threads (en termes de mémoire et de coût de changement de contexte).
  • La gestion des goroutines est plus simple grâce à des constructions de haut niveau, comme les canaux.
  • Cependant, contrairement aux threads, les goroutines partagent la même adresse mémoire, ce qui peut conduire à des problèmes de concurrence si elles ne sont pas correctement synchronisées.

Techniques de programmation concurrente en Go#

  • Les goroutines sont souvent utilisées avec des canaux, qui permettent une communication sûre entre les goroutines.
  • select permet de gérer plusieurs canaux simultanément.
  • Les patterns de concurrence, comme le pattern "worker", peuvent être facilement implémentés en Go grâce aux goroutines et aux canaux.
  • Le package sync fournit des primitives de bas niveau pour la synchronisation, comme Mutex pour la mutuelle exclusion, permettant de protéger les sections critiques du code.