Асинхронная итерация ответа на запрос с использованием Thin и Sinatra

Если ваш ответ в Sinatra возвращает «каждый» объект, цикл обработки событий Sinatra будет «каждый» ваш результат и выдает результаты в потоковом режиме в виде HTTP-ответа. Однако, если есть параллельные запросы к Sinatra, он будет перебирать все элементы одного ответа перед обработкой другого запроса. Если у нас есть курсор к результатам какого-либо запроса к БД, это означает, что нам нужно подождать, пока все данные будут доступны, прежде чем обрабатывать параллельный запрос.

Я посмотрел на камень асинк-синатры иhttp://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/думаю, что это решит мою проблему, но я попробовал этот пример:

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

и/delay/5 Запрос не работает одновременно, как я ожидаю, то есть я делаю 3 запроса одновременно, и отладчик Chrome отмечает время ответа примерно 5, 10 и 15 секунд.

Я пропускаю некоторые настройки или есть другой способ сказать Sinatra / Thin обрабатывать запросы одновременно?

Обновление: Вот еще один ключ в этом (или, возможно, проясняет ситуацию): Запускcurl -i <a href="http://localhost:3000/delay/5" rel="nofollow">http://localhost:3000/delay/5</a> одновременно имеет правильное поведение (2 запроса возвращаются через ~ 5 секунд). Бегab -c 10 -n 50 <a href="http://locahost:3000/delay/5" rel="nofollow">http://locahost:3000/delay/5</a> (утилита тестирования Apache) также возвращает что-то разумное для общего времени (~ 25 секунд). Firefox демонстрирует то же поведение, что и Chrome. Чем браузеры отличаются от утилит командной строки?

Ответы на вопрос(2)

Ваш ответ на вопрос