Iteración asincrónica sobre la respuesta de una solicitud utilizando Thin y Sinatra

Si su respuesta en Sinatra devuelve un objeto "accesible", el bucle de eventos de Sinatra "dará" su resultado y arrojará los resultados de forma continua como la respuesta HTTP. Sin embargo, si hay solicitudes concurrentes a Sinatra, iterará a través de todos los elementos de una respuesta antes de manejar otra solicitud. Si tenemos un cursor para los resultados de alguna consulta de base de datos, eso significa que tenemos que esperar a que todos los datos estén disponibles antes de manejar una consulta concurrente.

He mirado la gema async-sinatra yhttp://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/, pensando que esto resolvería mi problema, pero he probado este ejemplo:

require 'sinatra/async'

class AsyncTest < Sinatra::Base
  register Sinatra::Async

  aget '/' do
    body "hello async"
  end

  aget '/delay/:n' do |n|
    EM.add_timer(n.to_i) { body { "delayed for #{n} seconds" } }
  end
end

y el/delay/5 la solicitud no funciona simultáneamente como lo esperaba, es decir, hago 3 solicitudes simultáneamente y el depurador de Chrome observa que los tiempos de respuesta son aproximadamente 5, 10 y 15 segundos.

¿Me estoy perdiendo alguna configuración o hay otra forma de decirle a Sinatra / Thin que maneje las solicitudes de manera concurrente?

Actualización: Aquí hay otra llave en esto (o posiblemente aclara las cosas): Ejecucióncurl -i <a href="http://localhost:3000/delay/5" rel="nofollow">http://localhost:3000/delay/5</a> Al mismo tiempo tiene el comportamiento correcto (2 solicitudes cada una regresan en ~ 5 segundos). Corriendoab -c 10 -n 50 <a href="http://locahost:3000/delay/5" rel="nofollow">http://locahost:3000/delay/5</a> (la utilidad de referencia de Apache) también devuelve algo razonable para el tiempo total (~ 25 segundos). Firefox exhibe el mismo comportamiento que Chrome. ¿Qué están haciendo los navegadores diferentes de las utilidades de línea de comandos?

Respuestas a la pregunta(2)

Su respuesta a la pregunta