2009-12-03 16 views
0

Je suis en train d'écrire un projet qui consiste à exécuter deux threads parallèles pour extraire des données de différentes sources à intervalles réguliers. J'utilise la fonctionnalité Threads dans ruby ​​1.9 pour le faire, mais je suis malheureusement confronté à des problèmes d'interblocage. J'ai également le sentiment que la méthode Thread.join provoque la file d'attente des threads plutôt que leur exécution en parallèle.Serrures à pêne dormant Ruby

Je suis nouveau à la programmation multithread et des conseils seraient grandement appréciés

Vive

Patrick

EDIT: La ressource partagée que ces deux threads accèdent à une base de données de MySQL qui pourrait être le problème. Le blocage s'arrête après quelques itérations de ces threads.

+0

Salut Patrick. Pourriez-vous nous envoyer un code pour que nous puissions vérifier? En attendant, lire la section Threads and Processes du livre Pickaxe pourrait être utile. http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html – jkndrkn

Répondre

1

Vous pouvez utiliser des mécanismes de synchronisation tels que Mutex, Monitor, Queue, SizedQueue de la bibliothèque standard. Ou problème de les utiliser?

+0

Je n'étais pas au courant de tels mécanismes. Je vais regarder dans leur documentation maintenant. Merci –

1

Il est très difficile de diagnostiquer ce qui pourrait mal se passer sans plus de détails, mais l'impasse est (évidemment) causée par plusieurs threads essayant d'acquérir des ressources détenues par d'autres. Cela signifie vraiment que vous devez avoir au moins deux mutex et deux threads. Cela pourrait-il se produire dans votre code? Thread.join n'a rien à voir avec l'exécution parallèle - c'est une méthode de synchronisation pour permettre à un thread (généralement le maître) d'attendre qu'un ou plusieurs threads se terminent.

1

Quelle implémentation de Ruby 1.9 utilisez-vous? YARV ne peut pas exécuter Ruby Threads en parallèle. À l'heure actuelle, il n'y a pas d'implémentation de Ruby 1.9 prête pour la production qui peut exécuter des threads en parallèle. JRuby peut threads en parallèle, mais son implémentation de Ruby 1.9 n'est pas encore complète. (Bien qu'il est stable, donc si toutes les fonctionnalités dont vous avez besoin sont là, vous pouvez l'utiliser.)