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?