Asynchrones Durchlaufen der Antwort einer Anforderung mit Thin und Sinatra

Wenn Ihre Antwort in Sinatra ein 'eachable'-Objekt zurückgibt, wird die Ereignisschleife von Sinatra Ihr Ergebnis' einzeln 'und die Ergebnisse als HTTP-Antwort in Streaming-Form ausgeben. Wenn jedoch gleichzeitige Anforderungen an Sinatra vorliegen, werden alle Elemente einer Antwort durchlaufen, bevor eine andere Anforderung verarbeitet wird. Wenn wir einen Cursor auf das Ergebnis einer DB-Abfrage haben, müssen wir warten, bis alle Daten verfügbar sind, bevor wir eine gleichzeitige Abfrage bearbeiten.

Ich habe mir den Async-Sinatra-Edelstein angeschaut undhttp: //macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin, dachte, dies würde mein Problem lösen, aber ich habe dieses Beispiel ausprobiert:

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

und die/delay/5 request funktioniert nicht wie erwartet gleichzeitig, d. h. ich stelle 3 Anfragen gleichzeitig und der Chrome-Debugger notiert die Antwortzeiten als ungefähr 5, 10 und 15 Sekunden.

Fehlt mir ein Setup oder gibt es eine andere Möglichkeit, Sinatra / Thin anzuweisen, gleichzeitig mit Anfragen umzugehen?

Update: Hier ist ein weiterer Schlüssel in diesem (oder klärt möglicherweise Dinge): Runningcurl -i <a href="http://localhost:3000/delay/5" rel="nofollow">http://localhost:3000/delay/5</a> hat gleichzeitig das richtige Verhalten (2 Anfragen kommen jeweils in ~ 5 Sekunden zurück). Laufenab -c 10 -n 50 <a href="http://locahost:3000/delay/5" rel="nofollow">http://locahost:3000/delay/5</a> (das Apache-Benchmark-Dienstprogramm) gibt auch etwas zurück, das für die Gesamtzeit (~ 25 Sekunden) angemessen ist. Firefox zeigt dasselbe Verhalten wie Chrome. Was machen die Browser anders als die Befehlszeilendienstprogramme?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage