Iterando de forma assíncrona sobre a resposta de uma solicitação usando Thin e Sinatra

Se a sua resposta no Sinatra retornar um objeto 'acessível', o loop de eventos do Sinatra irá 'cada' seu resultado e produzirá os resultados de forma contínua como a resposta HTTP. No entanto, se houver solicitações simultâneas para o Sinatra, ele percorrerá todos os elementos de uma resposta antes de manipular outra solicitação. Se tivermos um cursor para os resultados de alguma consulta ao banco de dados, isso significa que precisamos aguardar que todos os dados estejam disponíveis antes de manipular uma consulta simultânea.

Eu olhei para a gema async-sinatra ehttp://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/, pensando que isso resolveria meu problema, mas eu tentei este exemplo:

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

e a/delay/5 A solicitação não funciona simultaneamente como eu esperava, ou seja, eu faço três solicitações simultaneamente e o depurador do Chrome observa os tempos de resposta em aproximadamente 5, 10 e 15 segundos.

Estou faltando alguma configuração ou há outra maneira de informar ao Sinatra / Thin para lidar com solicitações de maneira simultânea?

Atualização: Aqui está outra chave aqui (ou possivelmente esclarece as coisas):curl -i <a href="http://localhost:3000/delay/5" rel="nofollow">http://localhost:3000/delay/5</a> Simultaneamente, tem o comportamento correto (duas solicitações retornam em ~ 5 segundos). Corridaab -c 10 -n 50 <a href="http://locahost:3000/delay/5" rel="nofollow">http://locahost:3000/delay/5</a> (o utilitário de benchmark Apache) também retorna algo razoável para o tempo total (~ 25 segundos). O Firefox exibe o mesmo comportamento que o Chrome. O que os navegadores estão fazendo diferente dos utilitários de linha de comando?

questionAnswers(2)

yourAnswerToTheQuestion