« Programmation en Go/Goroutines » : différence entre les versions

Contenu supprimé Contenu ajouté
première version
(Aucune différence)

Version du 16 novembre 2010 à 19:50

Définition

Une goroutine est un fil d'éxécution tournant en parallèle avec d'autres goroutines à l'intérieur du même espace d'adressage (le processus).

Les goroutines permettent de paralléliser des tâches en les répartissant sur plusieurs coeurs ou processeurs. Le mot clé go permet de lancer un appel de fonction en une goroutine, et de ne pas attendre le résultat:

go list.Sort() // trie une liste en parallèle

Il est courant d'utiliser une fonction littérale pour appeler une goroutine.

Les canaux (de communication)

Un canal est un type de base de Go, et se déclare en plaçant chan avant le type de ses éléments. On peut créer un canal avec make:

c := make(chan int)

Ensuite on peut comme avec une file FIFO, enfiler ou dépiler un élément avec l'opérateur <-. Dans cet exemple, on lance une goroutine et on attend sa fin en recevant le signal qu'elle va envoyer:

go func() {
   list.Sort()
   c <- 1  // Envoie un signal, la valeur importe peu
}()
blahBlahPendantUnMoment()
<-c   // Attend la fin du tri de la liste à la réception du signal

Canaux avec tampon

On peut créer un canal avec un tampon en fournissant la taille du tampon en argument de make().

Lorsque le canal n'a pas de tampon, la goroutine qui enfile une valeur doit attendre qu'une autre goroutine dépile cette valeur. En revanche, avec un tampon, la goroutine qui enfile une donnée attend seulement que le tampon dispose d'une case vide pour y mettre la donnée.

Dans l'exemple suivant, MaxTaches tâches peuvent se dérouler en parallèle:

var sem = make(chan int, MaxTaches)
func handle(r *Requete) {
   sem <- 1    // attend que sem soit disponible
   process(r)  // cela peut prendre un certain temps.
   <-sem       // cela permet à la prochaine tâche de démarrer
}

func Serve(file chan *Requete) {
   for {
       requete := <-file
       go handle(requete)  // lance la goroutine
   }
}

La syntaxe suivante permet de savoir si une case est disponible dans le canal:

v,ok = <- canal

Définir le nombre de processeurs

En définissant la variable d'environnement GOMAXPROCS comme étant égale au moins au nombre de processeurs, ou en appelant runtime.GOMAXPROCS() avec ce nombre, on peut répartir les gorutines sur les différents coeurs ou processeurs sur un ordinateur particulier.