Je souhaite augmenter le débit d'un script qui effectue des E/S réseau (un scraper). Au lieu de le rendre multithread dans ruby (j'utilise l'interpréteur 1.9.1 par défaut), je veux lancer plusieurs processus. Donc, y a-t-il un système pour faire cela là où je peux suivre quand on finit de le relancer pour avoir le numéro X en cours d'exécution à tout moment. De même, certains fonctionneront avec des arguments de commande différents. Je pensais écrire un script bash mais cela semble être une mauvaise idée s'il existe déjà une méthode pour faire quelque chose comme ça sur Linux.Mise à l'échelle d'un script ruby en lançant plusieurs processus au lieu d'utiliser des threads
Répondre
Vous pouvez essayer fourchette http://ruby-doc.org/core/classes/Process.html#M003148
Vous pouvez obtenir le PID en retour et voir si ce processus fonctionne à nouveau ou non.
Si vous souhaitez gérer la concurrence d'E/S. Je vous suggère d'utiliser EventMachine.
Vous pouvez
- mettre en œuvre (ou trouver un bijou équivalent) un ThreadPool (ProcessPool, dans votre cas), ou
- préparer un tableau de tous, disons 1000 tâches à traiter, split dans, disons 10 blocs de 100 tâches (10 étant le nombre de processus parallèles que vous voulez lancer), et lancer 10 processus, dont chaque processus reçoit immédiatement 100 tâches à traiter. De cette façon, vous n'avez pas besoin de lancer 1000 processus et de contrôler que pas plus de 10 d'entre eux travaillent en même temps.
Je ne recommanderais pas bifurquer, mais plutôt que vous utilisez EventMachine (et l'excellent em-http-request si vous faites HTTP). La gestion de plusieurs processus peut être un peu plus complexe, voire plus que la gestion de plusieurs threads, mais la comparaison avec le chemin des événements est beaucoup plus simple. Puisque vous voulez faire principalement des E/S de réseau, qui consistent principalement en l'attente, je pense qu'une approche événementielle serait aussi bien mise à l'échelle, ou meilleure que le forking ou le threading. Et le plus important: il faudra beaucoup moins de code, et il sera plus lisible.
Même si vous décidez d'exécuter des processus distincts pour chaque tâche, EventMachine peut vous aider à écrire le code qui gère les sous-processus en utilisant, par exemple, EventMachine.popen
. Enfin, si vous voulez le faire sans EventMachine, lisez les documents pour IO.popen, Open3.popen et Open4.popen. Tous font plus ou moins la même chose mais vous donnent accès à stdin, stdout, stderr (Open3, Open4) et pid (Open4) du sous-processus.