Thin EventMachine Sinatra gegen Rails

9

Ich habe die Möglichkeit untersucht, einige Jobs mit EventMachine zu gestalten. In Sinatra scheint dies gut zu funktionieren, aber Rails 3 scheint alle Ticks auszuführen, bevor eine Ansicht gerendert wird.

Wenn ich den folgenden Code unter dem Thin-Webserver laufen lasse, verhält er sich wie erwartet. Die erste Anfrage kehrt sofort zurück und die zweite Anfrage wartet auf den 3-Sekunden-Schlafanruf, um zu beenden. Dies ist das erwartete Verhalten.

%Vor%

Während ich in Rails 3 laufe, versuche ich dasselbe zu tun: (läuft dünn)

%Vor%

In Rails wird der Schlafanruf vor dem Rendern der Ansicht an den Browser ausgeführt. Das Ergebnis ist, dass ich auf 3 Sekunden warten muss, damit die erste Seite gerendert wird.

Weiß jemand, warum das passiert? Ich bin nicht auf der Suche nach Kommentaren, ob dies eine gute Praxis ist oder nicht. Ich experimentiere einfach. Es ist interessant, kleine Aufgaben in die Reaktorschleife zu werfen. Warum sollte der Client warten müssen, wenn ich einige nicht blockierende HTTP-Anfragen mache?

    
Bruce Hauman 21.02.2011, 01:01
quelle

2 Antworten

3

Ich bin mir nicht sicher, dass dies die Antwort ist, nach der Sie suchen, aber ich habe vorher schon etwas darüber recherchiert. Lassen Sie mich Ihnen ein bisschen Hintergrundinformationen geben: Was wir erreichen wollten, war, dass Schienen bereits Teile des Vorlagenbaums (z. B. den ersten Teil des Layouts) löschten, selbst wenn die Controller-Aktion eine lange Zeit benötigt, um geladen zu werden. Dies hat zur Folge, dass der Benutzer bereits etwas in seinem Browser sieht, während der Webserver noch arbeitet. Natürlich muss die Hauptansicht mit dem Rendern warten, da sie wahrscheinlich Daten von der Controller-Aktion benötigt.

Diese Technik wird auch BigPipe genannt und Facebook hat dazu einen schönen Blog geschrieben: Ссылка

Wie auch immer, nachdem ich einige Nachforschungen angestellt habe, um dies für Rails 3 zu erreichen, fand ich diesen Blogbeitrag von Yehuda Katz. Ссылка

Also, jetzt denke ich, dass du wirklich beim Warten auf den Controller bleiben musst

    
Danny Hiemstra 23.02.2011 10:52
quelle
0

Die Verwendung von EM.defer anstelle von EM.next_tick bewirkt, dass der Schlaf nach dem Zurücksenden der Antwort erfolgt.

    
Josh Dzielak 06.10.2012 05:20
quelle