Envoyé par
abir84
(Ce sera très gentil de me donner les deux méthodes
)
Pour les threads, rien de plus simple. Exemple pour lancer 10 fois mon programme :
1 2 3 4 5 6 7 8 9
|
threads = []
10.times do |i|
threads[i] = Thread.new do
mon_programme
Thread.current["ma_variable"] = "Je suis le thread n°#{i}"
end
end |
Ne pas oublier de faire ensuite un join comme dans l'exemple ci dessous :
threads.each { |thread| thread.join ; puts thread["ma_variable"]}
...Sinon ton programme n'attendra pas que les threads soient tous terminés avant de s'arrêter.
Tu peux passer des arguments à Thread.new pour passer une variable externe. Tu peux même stoquer des valeurs dans un tableau de hachage dédié à chaque thread : thread["ma_variable"] dans mon exemple ci dessus. Et récupérer les valeurs ensuite à l'extérieur du thread (comme dans la boucle thread.join de mon exemple).
Mais attention lorsque plusieurs threads accèdent la même variable ou ressource extérieure : il faut gérer les accès concurrents (avec monitor ou mutex).
fork, je n'ai jamais utilisé car je suis sous Windows, mais a priori ce n'est pas bien compliqué non plus. Un exemple tiré du PickAxe Book :
1 2 3 4 5 6 7
| enfant = fork do
sleep 3
puts "L'enfant vous dit : 'Bonjour' !"
end
puts "J'attends mon processus enfant..."
Process.wait enfant
puts "Terminé !" |
Tu peux bien sûr "forker" plusieurs fois :
5.times do fork { mon_programme } end
Je n'ai testé aucun des ex ci dessus, donc j'ai peut être des erreurs de syntaxe, mais l'idée est là.
Côme
Partager