Quiero descargar un bloque de código en mi proceso principal al proceso hijo para que se ejecute al mismo tiempo. También quiero tener el PID del proceso hijo engendrado para poder controlarlo y matarlo si es necesario.¿Cómo se genera un proceso secundario en Ruby?
Respuesta
Puede usar el método de kernel fork
. Este es un ejemplo:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
El método fork
devuelve el PID del proceso se bifurca y ejecuta cualquier código en el bloque pasado. Al igual que los bloques regulares de Ruby, mantiene los enlaces del proceso principal.
Es una buena idea hacer su proceso bifurcado exit
.
Además de la gran respuesta de Chris, recuerde llamar al Process.wait
de su maestro para cosechar el proceso de su hijo, de lo contrario dejará zombies atrás.
ejemplo como se solicita en los comentarios:
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
Dulce, eso fue un consejo increíble. –
¿Dónde y cómo colocaría Process.wait en la respuesta aceptada anteriormente? – iamtoc
Tenga en cuenta que 'Process.wait' sin un argumento espera _any_ child, por lo que en un caso más general, este fragmento de código saldrá del elemento primario incluso si ese proceso secundario específico anterior no se cierra. Una versión más exacta diría 'Process.wait (pid)' en su lugar. – sameers
Si usted está dispuesto a utilizar hilos, en lugar de Procesos, entonces algo como esto puede ser un poco más escalable a más-que-un tenedor:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
Consulte los excelentes comentarios y referencias de John Topley a continuación, sobre el modelo de ejecución de Ruby y sus restricciones.
acaba de editar para corregir un error evidente (sin asignación de tareas), y para seguir a @ consejos (Jason King) 's.
¿Se supone que estos son hilos verdes en lugar de los hilos adecuados del sistema operativo? –
Lea esto respecto a Ruby 1.9: http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/ –
Debería ser: 'Thread.new (thing) {| it | doit (it)} ' Porque' thing' se restablece en cada iteración, por lo que no hay garantía de que el hilo correcto obtenga la 'cosa correcta' – smathy
En 1.9 puede usar el comando Process.spawn. Ver también http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
Una buena alternativa al tenedor/exec/desove es la joya POSIX-desove para Ruby 1.9: https://github.com/rtomayko/posix-spawn
Se hizo la mayor parte del trabajo duro para que sea más fácil, eficiente y flexible en comparación con los métodos de nivel inferior.
- 1. ¿Genera un proceso en segundo plano en Ruby en Windows?
- 2. Python genera un subproceso secundario, se separa y sale
- 3. Secuencia de salida del proceso secundario en Ruby
- 4. ¿Cómo matar un proceso secundario por el proceso principal?
- 5. NodeJS: proceso del nodo secundario?
- 6. ¿Cómo devuelve fork() para el proceso secundario
- 7. GDB backtrace en el proceso secundario
- 8. ¿Cómo se genera un sessionID?
- 9. Comprobación del estado de un proceso secundario en C++
- 10. Seleccione qué identificadores se heredan mediante el proceso secundario
- 11. Visual Studio: adjuntar automáticamente a un proceso cuando se genera el proceso
- 12. Adjunte el proceso secundario al depurador
- 13. engendrar un proceso de fondo en Ruby
- 14. ¿Qué proceso se ejecuta en un servidor IIS genera un w3wp.exe para cada aplicación asp.net?
- 15. Salir del proceso secundario después de os.fork()
- 16. Cómo matar un proceso secundario después de un tiempo de espera determinado en Bash?
- 17. ¿Cómo se inicia un proceso en segundo plano en Perl?
- 18. Cómo termina el proceso secundario cuando finaliza el proceso primario en C#
- 19. ¿Cómo verificar un proceso en ejecución con Ruby?
- 20. Cómo sincronizar la ejecución del proceso principal/secundario?
- 21. Señal de captura en el proceso de fondo secundario
- 22. Problema al enviar la señal al proceso secundario en C
- 23. ¿Cómo se genera un número aleatorio en C#?
- 24. ¿Cómo se genera un número aleatorio en tiempo de ejecución?
- 25. Obtenga el estado del proceso por pid en Ruby
- 26. Supervisar el uso de la memoria del proceso secundario
- 27. ¿Cómo puedo verificar desde Ruby si se está ejecutando un proceso con un determinado pid?
- 28. Cómo eliminar un objeto secundario en NHibernate?
- 29. depurando un proceso creado con CreateProcess en Visual Studio
- 30. Proceso secundario que detecta la muerte del proceso primario en Python
Una cosa para recordar con Ruby es que no todas las cosas funcionan exactamente de la misma manera en Windows frente a * nix. A veces no se implementan completamente en Windows, por lo que debe usar bajo su propio riesgo. – Daemin
Éste no funcionaría en Windows en absoluto – vava
@Vadim Creo que es una característica, no un error. –