Pregunta

Ryan Tomayko provocó una gran tormenta de fuego con esta publicación sobre el uso del control de procesos de Unix comandos.

  

Deberíamos estar haciendo más de esto. Mucho más de esto. Estoy hablando de fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2), y así sucesivamente. Estos son nuestros amigos. Ellos quieren tanto para ayudarnos.

Tengo un poco de código (un clon de delayed_job para DataMapper que creo que encajaría con esto, pero no tengo claro cómo aprovechar los comandos listados. Cualquier idea ¿Cómo mejorar este código?

def start
  say "*** Starting job worker #{@name}"
  t = Thread.new do
    loop do
      delay = Update.work_off(self)
      break if $exit
      sleep delay
      break if $exit
    end
    clear_locks
  end

  trap('TERM') { terminate_with t }
  trap('INT')  { terminate_with t }

  trap('USR1') do
    say "Wakeup Signal Caught"
    t.run
  end
end
¿Fue útil?

Solución

Ahh sí ... los peligros de " Deberíamos hacer más de esto " sin explicar qué hace cada uno de ellos y en qué circunstancias los usarías. Para algo como delayed_job puede incluso estar usando fork sin saber que está utilizando fork . Dicho esto, realmente no importa. Ryan estaba hablando sobre el uso de fork para los servidores de preforking. delayed_job usaría fork para convertir un proceso en un demonio. La misma llamada al sistema, diferentes propósitos. Ejecutar delayed_job en el primer plano (sin fork ) vs en segundo plano (con fork ) resultará en una diferencia de rendimiento insignificante.

Sin embargo, si escribes un servidor que acepta conexiones concurrentes, ahora el consejo de Ryan es acertado.

  • fork : crea una copia del proceso original
  • execve : detiene la ejecución del archivo actual y comienza a ejecutar un nuevo archivo en el mismo proceso (muy útil en tareas de rake)
  • pipe : crea un conducto (dos descriptores de archivo, uno para leer y otro para escribir)
  • socketpair : como una tubería, pero para enchufes
  • select : vamos a esperar a que uno o más de los múltiples descriptores de archivos estén listos con un tiempo de espera
  • kill : se utiliza para enviar una señal a un proceso
  • sigaction : le permite cambiar lo que sucede cuando un proceso recibe una señal

Otros consejos

5 meses después, puede ver mi solución en http://github.com/antarestrader/Updater. Mira lib / updater / fork_worker.rb

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top