Mi conjetura es que sea algo está atando el circuito del reactor EventMachine evitando que salga, o algo está atrapando SIGINT.
Como un simple ejemplo de lo primero, poner esto en config.ru
y correr con thin -p 4567 start
:
require 'thin'
require 'sinatra'
require 'eventmachine'
get '/' do
"hello world"
end
run Sinatra::Application
EventMachine.schedule do
trap("INT") do
puts "Caught SIGINT"
EventMachine.stop # this is useless
# exit # this stops the EventMachine
end
i = 0
while i < 10
puts "EM Running"
i += 1
sleep 1
end
end
sin atrapar la SIGINT, se obtiene el mismo comportamiento que cuando atrapándola y llamando EM.stop. EM.stop (al menos en la versión de ruby puro, que se puede ejecutar con EVENTMACHINE_LIBRARY="pure_ruby" thin start
) establece un indicador de que se ha solicitado una detención, que se recoge dentro del bucle del reactor. Si el bucle del reactor está atascado en un escalón (como en el caso anterior), entonces no saldrá.
Así que un par de opciones:
utilizar la solución anterior de atrapar SIGINT y forzar una salida. Esto podría dejar las conexiones en un estado impuro, pero no llamarlo rápida & sucia por nada;)
que podría poner el código de bloqueo en el interior de un hilo o una fibra, lo que permitirá el reactor para mantener corriendo.
busque tareas o bucles de larga ejecución dentro de su código, y conviértalos para que sean compatibles con EventMachine. em-http-request es una gran biblioteca para solicitudes http externas, y em-synchrony tiene muchos otros protocolos (para conexiones de bases de datos, grupos de conexiones tcp, etc.). En el ejemplo anterior, esto es sencillo: EventMachine.add_periodic_timer(1) { puts "EM Running" }
en su código real, esto podría ser más difícil de localizar, pero buscar los lugares donde desovan las discusiones y unirse a ellos, o grandes bucles. Una herramienta de creación de perfiles puede ayudar a mostrar qué código se está ejecutando cuando intentas salir, y por último puedes intentar deshabilitar varias partes del sistema y las bibliotecas para descubrir dónde está el culpable.
¿Puede proporcionar sus archivos de configuración delgados y de tapa por favor? – Anatoly
Pruebe 'ctrl + Z' y luego' Enter'? – Zabba
También podría probar la poco conocida Ctrl- \ que a veces funciona de maravilla. –