Wird bei jeder Anfrage eine neue Instanz von sinatra gestartet?

8

Wenn eine neue http-Anfrage hereinkommt, wird eine neue Instanz von sinatra gestartet, z. muss sinatra initialisiert werden, oder wird nur die Methode einer vorherigen Instanz (die entsprechende get / post Methode / Route) von sinatra aufgerufen? Danke für alle Dokumentationslinks, ich konnte keine finden.

Es wäre auch interessant, wenn dieses Verhalten vom Bereitstellungstyp abhängig ist - WEBrick / Passenger usw.

    
user562529 26.11.2011, 21:12
quelle

4 Antworten

12

Für jede Anfrage wird eine neue Klasse erstellt. Dies wird jedoch von Rack nicht erledigt. Dies ist ein Merkmal von Sinatra. Wenn Sie in die Details eintauchen möchten: Die Instanz wird nicht wirklich mit Sinatra::Application.new erstellt, sondern mit Sinatra::Application.prototype.dup , siehe Sinatra::Base#call für den Code.

    
Konstantin Haase 01.12.2011, 22:18
quelle
2

Sie sollten immer davon ausgehen, dass die gesamte App unter Ihren Zwischenanforderungen neu gestartet werden kann. Was ist, wenn Sie 16 Kopien Ihrer App laufen lassen - die Anfrage von Benutzer 'jane' für '/' könnte Kopie # 2 einholen, dann wird die Anfrage bei '/ Anmeldung' auf # 12 (möglicherweise gestartet dafür) treffen Ereignis) -App. Es spielt also keine Rolle, was Sinatra macht (obwohl es so aussieht, als würden sie etwas Ähnliches tun), da Ihre App einfach irgendwo auftauchen könnte, heute, gestern oder vor einem Jahr.

Wenn Sie planen, zu wachsen - oder sich auf Heroku usw. zu beschränken - muss Ihre App mit "Shotgun" gut laufen - was alles für jede Anfrage neu startet. Ich denke, wenn Ihre App etwas radikal anderes tut, als Webseiten zu bedienen, und fast nie abstürzt oder neu gestartet wird, könnten Sie mit "NEIN" durchkommen.

Also meine Antwort ist "JA" (aber nicht immer, und manchmal auch nicht oft).

Dennoch ist es praktisch zu wissen, wie die Dinge funktionieren, so dass Sie vielleicht nur einmal pro App-Last ein komplexes, berechnetes Asset-Caching-Schema einrichten können - was eine Performance-Option ist. Wenn beispielsweise bei jedem Aufruf Ihrer App mit der URL / calculate_pi? Decimals = 2000 immer dieselbe 2000-stellige Zahl angezeigt wird, können Sie diese bei jeder Instanz zwischenspeichern.

    
Tom Andersen 07.12.2011 02:12
quelle
0

Ein schneller Test zeigt, dass dieselbe Instanz (zumindest standardmäßig) die Anfrage ausführt.

%Vor%

Wenn dieser Code ausgeführt wird und zwei Anfragen eingehen, fordert der Server flag is unset und dann flag is unset an.

BEARBEITEN:

Das zeigt, dass die Dateien nicht neu geladen werden. Durch Verwendung von puts self.object_id, self.class (als pguardiario empfohlen) sehen wir tatsächlich, dass für jede Anfrage eine neue Instanz von Sinatra::Application erstellt wird.

    
thoferon 26.11.2011 22:36
quelle
0

Führen Sie das aus, Sie werden alles wissen, aber es bedeutet nicht, dass das Rack mechanisch als Sinatra ausgeführt wird. (Tatsächlich erstellt das Rack für jede Anfrage eine neue Instanz)

%Vor%     
coolesting 28.11.2011 02:00
quelle

Tags und Links