Aller au contenu

Programmation Ruby/Programmation concurrente

Un livre de Wikilivres.

Ruby intègre nativement la notion de processus et de processus léger.

Utiliser des processus légers

[modifier | modifier le wikicode]

Les processus légers sont représentés par la classe Thread. À la construction du thread, on passe un bloc qui sera exécuté.

# Un entier, un thread qui l'incrémente
# et un thread qui le décrémente
i = 0

Thread.new {
  while true
    i = i + 1
    puts i
  end
}

Thread.new {
  while true
    i = i - 1
    puts i
  end
}

Synchroniser des données

[modifier | modifier le wikicode]

Dans l'exemple ci-dessus, la variable i est partagée. Cela peut poser un problème de synchronisation. Pour le résoudre, on utilise un sémaphore. Pour qu'un objet soit synchronisé, il faut lui ajouter un attribut Mutex.

Arrêter un thread

[modifier | modifier le wikicode]

Pour arrêter un thread proprement, on affecte son attribut @continue à faux (par exemple dans une méthode #stop).

On peut arrêter un thread de façon brutale avec un appel à Thread#terminate.