Sobes.tech
Junior

Quelle est la différence entre les goroutines et les threads (fils d'exécution) ?

sobes.tech IA

Réponse de l'IA

Les goroutines diffèrent des threads (fils d'exécution) par les aspects clés suivants :

  • Gestion : Les goroutines sont gérées par l'environnement d'exécution de Go, tandis que les threads sont gérés par le système d'exploitation. Cela rend la commutation entre goroutines beaucoup plus légère et rapide, car elle ne nécessite pas de changement de contexte du noyau.
  • Coûts : La création et la gestion des goroutines nécessitent beaucoup moins de ressources (mémoire et temps) par rapport aux threads. Une goroutine commence avec une pile très petite (quelques kilo-octets), qui peut croître ou diminuer dynamiquement selon les besoins, alors que les threads ont une pile fixe, souvent beaucoup plus grande.
  • Scalabilité : Grâce à leurs faibles coûts, il est facile de créer des centaines de milliers ou même des millions de goroutines dans une seule application, alors que la création du même nombre de threads épuisera rapidement les ressources du système.
  • Planification : Le planificateur de Go multiplexe de nombreuses goroutines sur un nombre réduit de threads du système d'exploitation. Cela implémente la multitâche coopérative entre goroutines sur un seul thread OS (avec des éléments de préemption), alors que les threads OS sont gérés par le planificateur du système d'exploitation, qui utilise la multitâche préemptive.
Aspect Goroutines Threads
Gestion Environnement d'exécution de Go Système d'exploitation
Coûts Faibles (mémoire, temps) Élevés (mémoire, temps)
Scalabilité Très élevée Limitée par les ressources système
Planification Planificateur de Go (coopératif) Planificateur du système d'exploitation (préemptif)
Pile Dynamique, petite Fixe, souvent grande

Exemple de création d'une goroutine :

package main

import (
	"fmt"
	"time"
)

func tâche(id int) {
	fmt.Printf("Goroutine %d a commencé\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Goroutine %d a terminé\n", id)
}

func main() {
	go tâche(1) // Création d'une goroutine
	go tâche(2) // Création d'une autre goroutine

	time.Sleep(2 * time.Second) // Attendre que les goroutines se terminent
	fmt.Println("Goroutine principale terminée")
}