Es Sinatra multi threaded?


Es Sinatra multi-threaded? Leí más donde "sinatra es multi-threaded por defecto", ¿qué implica eso?

Considere este ejemplo

get "/multithread" do
  t1 = Thread.new{
    puts "sleeping for 10 sec"
    sleep 10
    # Actually make a call to Third party API using HTTP NET or whatever.
  }
  t1.join
  "multi thread"
end

get "/dummy" do
  "dummy"
end

Si tengo acceso a "/multithread" y "/dummy" posteriormente en otra pestaña o navegador, entonces no se puede servir nada(en este caso durante 10 segundos) hasta que se complete la solicitud "/multithread". En caso de que la actividad se congela, la aplicación deja de responder.

¿Cómo podemos trabajar alrededor de esto sin generar otra instancia de la ¿solicitud?

Author: ch4nd4n, 2011-06-08

5 answers

Tl; dr Sinatra funciona bien con hilos, pero probablemente tendrá que usar un servidor web diferente.

Sinatra no impone ningún modelo de concurrencia, ni siquiera maneja la concurrencia. Esto lo hace el manejador de Rack (servidor web), como Thin, WEBrick o Passenger. Sinatra en sí es seguro para subprocesos, lo que significa que si su controlador de rack utiliza múltiples subprocesos para las solicitudes del servidor, funciona bien. Sin embargo, dado que Ruby 1.8 solo soporta hilos verdes y Ruby 1.9 tiene un global VM lock, los subprocesos no se usan ampliamente para la concurrencia, ya que en ambas versiones, los subprocesos no se ejecutarán realmente en paralelo. La voluntad, sin embargo, en JRuby o el próximo Rubinius 2.0 (ambas implementaciones alternativas de Ruby).

La mayoría de los manejadores de rack existentes que usan subprocesos usarán un grupo de subprocesos para reutilizar subprocesos en lugar de crear realmente un subproceso para cada solicitud entrante, ya que la creación de subprocesos no es gratuita, esp. en 1.9 donde los hilos asignan 1: 1 a los hilos nativos. Verde los hilos tienen mucho menos sobrecarga, por lo que las fibras, que son básicamente hilos verdes programados cooperativamente, como se utiliza por el mencionado sinatra-synchrony, se hicieron tan populares recientemente. Debe tener en cuenta que cualquier comunicación de red tendrá que pasar por EventMachine, por lo que no puede usar la gema mysql, por ejemplo, para hablar con su base de datos.

Las fibras se escalan bien para el procesamiento intenso de la red, pero fallan miserablemente para cálculos pesados. Es menos probable que corras una carrera condiciones, una trampa común con la concurrencia, si utiliza fibras, ya que solo hacen un cambio de contexto en puntos claramente definidos (con sincronía, cada vez que espera por IO). Hay un tercer modelo común de concurrencia: Procesos. Puede usar el servidor preforking o iniciar varios procesos usted mismo. Si bien esto parece una mala idea a primera vista, tiene algunas ventajas: En la implementación normal de Ruby, esta es la única manera de usar todas sus CPU simultáneamente. Y evitas el estado compartido, así que no hay raza condiciones por definición. Además, las aplicaciones multiproceso se escalan fácilmente en varias máquinas. Tenga en cuenta que puede combinar varios procesos con otros modelos de concurrencia (evented, cooperative, preemptive).

La elección se hace principalmente por el servidor y el middleware que utiliza:

  • Multiproceso, no preforking: Mestizo, Delgado, WEBrick, Zbatery{[18]]}
  • Multiproceso, preforking: Unicornio, Arco iris, Pasajero
  • Evented (adecuado para sinatra-synchrony): Delgado, Arco iris, Zbatery
  • Threaded: Net:: HTTP:: Server, Threaded Mestizo, Puma, Arco iris, Zbatery, Delgado[1], Phusion Passenger Enterprise > = 4

[1] desde Sinatra 1.3.0, Thin se iniciará en modo enhebrado, si es iniciado por Sinatra (es decir, con ruby app.rb, pero no con el comando thin, ni con rackup).

 91
Author: Konstantin Haase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-06 09:29:18

Mientras buscaba en Google, encontró esta gema:

Sinatra-synchrony

Lo que podría ayudarte, porque te toca la pregunta.

También hay un punto de referencia, hicieron casi lo mismo que usted desea (llamadas externas).

Conclusión: EventMachine es la respuesta aquí!

 6
Author: asaaki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-08 15:41:36

Pensé que podría elaborar para las personas que se encuentran con esto. Sinatra incluye este pequeño fragmento de código:

   server.threaded = settings.threaded if server.respond_to? :threaded=    

Sinatra detectará qué gema ha instalado para un servidor web (aka, thin, puma, lo que sea.) y si responde a "enhebrado" lo configurará para ser enhebrado si se solicita. Ordenado.

 4
Author: Joel Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 23:53:53

Después de hacer algunos cambios en el código, pude ejecutar la aplicación padrino/sinatra en mizuno . Inicialmente traté de ejecutar la aplicación Padrino en JRuby, pero era simplemente demasiado inestable y no investigué por qué. Me enfrentaba a accidentes de JVM cuando corría en JRuby. También revisé este artículo, lo que me hace pensar por qué incluso elegir Ruby si el despliegue puede ser cualquier cosa menos fácil.

¿Hay alguna discusión sobre el despliegue de aplicaciones en ruby? O puedo generar un nuevo hilo :)

 1
Author: ch4nd4n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-23 10:26:20

He estado entrando en JRuby últimamente y estoy extremadamente sorprendido de lo simple que es cambiar de IRM a JRuby. Más o menos implica el intercambio de algunas gemas (en la mayoría de los casos).

Debería echar un vistazo a la combinación JRuby y Trinidad (Servidor de aplicaciones). Torquebox también parece ser una solución todo en uno interesante, viene con mucho más que un servidor de aplicaciones.

Si desea tener un servidor de aplicaciones que admita el subproceso y está familiarizado con Mongrel, Thin, Unicorn, etc., entonces Trinidad es probablemente la más fácil de migrar ya que es prácticamente idéntica desde la perspectiva de los usuarios. Me encanta hasta ahora!

 1
Author: Michael van Rooijen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-11 06:30:22