Comment avez-vous frayer un processus enfant en Ruby?
Je veux le déchargement d'un bloc de code dans mon processus principal de processus enfant pour le faire fonctionner en même temps. Je veux aussi avoir le PID de la donné naissance à l'enfant de processus afin que je puisse surveiller et de le tuer si nécessaire.
Vous devez vous connecter pour publier un commentaire.
En plus de Chris grande réponse, n'oubliez pas d'appeler
Process.wait
de votre master dans le but de profiter à votre enfant de processus, sinon vous allez laisser les zombies derrière.Exemple, comme demandé dans les commentaires:
Process.wait
sans argument attend aucun de l'enfant, de sorte que dans un cas plus général, cet extrait de code serait quitter le parent, même si cet enfant en particulier le processus ci-dessus n'a pas de sortie. Une plus exact de la version diraisProcess.wait(pid)
à la place.fork
, car c'est seulement sur Unix)?Process.waitall
. Le parent doit attendre jusqu'à ce que TOUS childs sortie.Vous pouvez utiliser le
fork
noyau de la méthode. Voici un exemple:La
fork
méthode retourne le PID du processus de fourche et exécute le code dans le bloc passé. Comme des Rubis blocs il maintient les liaisons du processus parent.C'est une bonne idée pour faire de votre fourche processus
exit
.exit
pourquoi (ou quand) est-elle nécessaire?exit
à l'intérieur de votre fourche processus après la fin de l'exécution de son code, ou la nouvelleruby
processus qui a vu le jour continue de fonctionner en arrière-plan.exit
avec le code par défaut est pas nécessaire avec cette forme de fourche, du " bloc est exécuté dans le sous-processus, et le sous-processus se termine avec un état de zéro." Pour éviter de créer un zombie, vous devez soitProcess.wait
ouProcess.detach
dans le processus parent. ruby-doc.org/core-2.2.3/Kernel.html#method-i-forkDans 1,9 vous pouvez utiliser le Processus.commande spawn.
Voir aussi http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
Si vous êtes heureux d'utiliser des Threads, plutôt que sur les Processus, alors quelque chose comme ceci peut être un peu plus diversifié, plus-que-l'une des fourches:
Veuillez voir Jean Topley excellents commentaires et de référence, ci-dessous, concernant le Rubis modèle d'exécution et ses restrictions.
Juste édité pour corriger une erreur manifeste (pas de cession à la tâche), et de suivre @(Jason King)'s des conseils.
Thread.new(thing) { |it| doit(it) }
Parce quething
est réinitialisé à chaque itération, donc il n'y a aucune garantie que le fil de droite vont obtenir le droitthing
Une bonne alternative à la fork/exec/spawn est la posix-spawn gem Ruby 1.9: https://github.com/rtomayko/posix-spawn
Ils ont fait le plus dur du travail pour le rendre plus facile, efficace et flexible par rapport à la baisse de niveau des méthodes.