Programmation Ruby/Programmation concurrente


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

Utiliser des processus légersModifier

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éesModifier

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 threadModifier

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.