Sur mon rubis sur les rails, j'ai besoin d'exécuter 50 emplois de fond en parallèle. Chaque travail crée une connexion TCP à un autre serveur, fechs quelques données et met à jour un objet d'enregistrement actif. P>
Je connais différentes solutions pour effectuer cette tâche, mais l'une d'entre elles en parallèle. Par exemple, retarded_job (DJ) pourrait être une excellente solution si seulement elle pouvait exécuter tous les travaux en parallèle. P>
Des idées? Merci. P>
3 Réponses :
Il est réellement possible d'exécuter plusieurs travailleurs retardés_job.
de http://github.com/collectiveDea/ retarded_job : p> Donc, en théorie, vous pouvez simplement exécuter: p> Ceci va frayer 50 Les processus, toutefois, je ne suis pas sûr de savoir si cela serait recommandé en fonction des ressources du système que vous exécutez sur cela. P> Une autre option serait d'utiliser threads . Simplyez simplement un nouveau fil pour chacun de vos travaux. P> Une chose à porter est que cette méthode est que
activerecord code> n'est pas un fil-coffre-fort. Vous pouvez le faire filer-sécurité à l'aide des paramètres suivants: P>
ActiveRecord::Base.allow_concurrency = true
Vous pouvez également exécuter des travailleurs retardés_job sur plusieurs machines. Je doute que vous obtiendrez beaucoup d'avantages à courir plus de travailleurs sur une seule machine que vous avez des cœurs CPU, mais vous pouvez étalage de la charge en l'exécutant sur plusieurs cases. Si vous devez exécuter 50 simultanément, je pense que vous allez avoir besoin de distribuer le travail.
Je vais avoir des avantages à exécuter plusieurs travailleurs sur une seule machine parce que la plupart des travailleurs seront bloqués par IO
Certaines pensées ...
Juste parce que vous devez lire 50 sites et que vous voulez naturellement que certains travaux parallèles ne soient pas em> signifient que vous avez besoin de 50 processus ou de fils. Vous devez équilibrer le ralentissement et les frais généraux. Que diriez-vous d'avoir 10 ou 20 processus lisent chacun quelques sites? P> LI>
Selon le rubis que vous utilisez, faites attention aux filets verts, vous ne pouvez pas obtenir le résultat parallèle que vous souhaitez p> li>
Vous voudrez peut-être certainement le structurer comme une inetd inetd inverse, le côté client et utiliser Ainsi, quelque chose comme ça de la bibliothèque de socket ... Étendez-le pour plusieurs connexions exceptionnelles ... p> connect_nonblock code> et
io.select code> pour obtenir les connexions parallèles que vous voulez par Faire réagir tous les serveurs en parallèle. Vous n'avez pas vraiment besoin de traitement parallèle des résultats, il vous suffit de vous mettre en ligne à tous les serveurs en parallèle, car c'est là que c'est où la latence est vraiment. P> li>
ul>
Io.Sélectionnez pourrait être utile dans ce cas, je vais essayer d'essayer. Merci.
Puisque vous travaillez avec des rails, je vous conseillerais d'utiliser retarded_job pour le faire plutôt que de se diviser dans des fils ou des fourches. La raison étant - traitant des délais d'attente et des trucs lorsque le navigateur attend peut être une vraie douleur. Il y a deux approches que vous pouvez prendre avec DJ p>
Le premier est - Spawn 50+ travailleurs. Selon votre environnement, cela peut être une jolie solution lourde mémoire, mais cela fonctionne bien. Ensuite, lorsque vous devez exécuter votre travail, assurez-vous de créer 50 emplois uniques. S'il y a trop de mémoire de mémoire et que vous voulez faire des choses de cette façon, faites un environnement séparé qui est dépouillé, spécifiquement pour vos travailleurs. P>
La deuxième méthode consiste à créer un seul travail utilisant Curl :: Multi pour exécuter vos 50 demandes TCP simultanées. Vous pouvez en savoir plus ici: http://curl-multi.rubyforge.org/ De cette manière, vous pouvez avoir un processeur de fond exécutant toutes vos demandes TCP en parallèle. P>
Une autre solution ici: Stackoverflow.com/Questtions/16551466/ ...
Intéressant, merci @rdx