2010-08-06 4 views
0

Alors, j'ai écrit un exemple de fil rapide pour moi-même, en utilisant les docs de rubis pour le fil:Essayer de comprendre Threading en Ruby. Le code de test ne fonctionne pas comme prévu, pourquoi?

puts "Hello World" 
test = Thread.new do 
while true 
    puts Time.now 
end 
end 
puts "Goodbye World" 

Je me attendrais ce code à courir pour toujours, l'impression « Bonjour tout le monde », quelques horodateurs, monde au revoir, et puis tout un tas d'horodatages, jusqu'à ce que je casse manuellement le code.

Au lieu de cela, ce que je reçois est quelque chose comme:

Hello World 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Fri Aug 06 09:08:27 -0400 2010 
Goodbye World 

Et puis le programme se termine. Je suis vraiment confus ici. Les threads se terminent-ils dès que la prochaine ligne de code aurait démarré? Est-ce qu'ils expirent? Je l'ai essayé d'ajouter

sleep 1 

avant et après l'instruction met ... mais cela signifie simplement que les impressions de fil moins horodateurs (si le sommeil est avant puts, il imprime rien, juste bonjour et au revoir, si après, il imprime exactement un horodatage avant de quitter).

Je n'ai pas le plus d'expérience de threading ... mais cela ne me semble vraiment pas intuitif ... Est-ce que je fais quelque chose de mal? Utiliser les threads de manière incorrecte? Est-ce que je le fais bien mais suis confus au sujet de ce que les fils sont/font?

Répondre

6
puts "Hello World" 
test = Thread.new do 
    while true 
    puts Time.now 
    end 
end 
puts "Goodbye World"   
test.join 

Appel de la méthode .join sur une instance de classe Thread fera l'arrêt du programme et attendez que le fil pour terminer.

+0

Pour accomplir ce qu'elle attend, la jointure aurait besoin d'être * après * le message "au revoir". – cHao

1

Je ne suis pas sûr de la substance spécifique à Ruby. En dehors de cela, généralement lorsque le script se termine, le programme se termine - dans de nombreux cas, tous les threads sont tués avant la sortie de l'interpréteur. Les threads sont juste un moyen de faire quelques choses à la fois - vous ne devriez pas compter sur eux pour garder votre programme en vie, surtout une fois que le thread principal (celui qui a tout commencé) meurt. Si vous voulez attendre la fin d'un thread, la plupart des langages ont une fonction "join" ou "wait" qui laisse le thread terminer. Mais une fois le fil principal terminé, tous les paris sont désactivés. Cela dit, Ruby peut décider de laisser filer les filets jusqu'à leur finition. Comme je l'ai dit, je ne suis pas sûr de ça, parce que c'est spécifique à Ruby. Mais d'après l'apparence des choses, il semblerait que non.

+1

Assez juste. Pour ce que je veux VRAIMENT cela car c'est équivalent à juste lancer un fil pour faire le travail, et avoir le fil lui-même encapsulé dans une boucle.J'étais juste confus qu'il y avait encore des choses à faire, mais il était en train de démissionner – Jenny

+0

Vous avez un peu besoin de garder les threads un peu au moment de la sortie, attendez qu'ils se terminent avant la fin du programme, apparemment, Ruby a en effet une méthode "join" faite juste pour ça :) – cHao

Questions connexes