2017-12-22 11 views
0

Ich benutze Tornado Web Framework, aber eine meiner Implementierungsumgebungen ist mod_wsgi auf Prefork Apache 2 (seltsame Hosting-Anforderung).Was ist die nominale mod_wsgi WSGIDaemonProcess-Konfiguration zum Ausführen von Tornado WSGIAdapter-Apps?

Ist processes=n threads=1 der richtige Weg, meine WSGIDaemonProcess für eine tornado.wsgi.WSGIAdapter einzurichten? Mein eigener Code sollte threadsicher sein, aber ich binde eine SQLAlchemy Session() an eine Instanz von tornado.web.RequestHandler im Handler .prepare() als here (ich verwende offensichtlich keine Coroutines im WSGI-Modus). Ich benutze auch Blockierung tornado.httpclient.HTTPClient in einigen Anfrage-Handler.

Auch verarbeitet WSGIDaemonProcess Gabel() vergleichbar mit tornado.httpserver.HTTPServer().start(n)?

(Ich schreibe diese Frage hier, da ich keine Ahnung habe, wie man @Ben Darnell und @Graham Dumpleton gleichzeitig fragt, ohne Tornado und mod_wsgi Listen zu verschicken).

+0

Was meinen Sie mit "non-threadsafe Code in Tornado"? Schlägst du vor, dass Tornado Web Framework selbst nicht threadsicher ist, oder dass dein eigener Code nicht threadsicher ist? Ich kenne keine Bedenken hinsichtlich der Thread-Sicherheit von Tornado Web Framework selbst. –

+0

Mein eigener Code ist threadsafe; Alle Globalen, die ich verwende, sind konstant. Ich habe die Frage bearbeitet, um mehr zu reflektieren, worüber ich besorgt bin. – cowbert

Antwort

1

WSGIAdapterist threadsicher, und so ist die Teilmenge von Tornado, die mit ihm arbeitet (RequestHandler.write, zum Beispiel, ist threadsicher, wenn es mit WSGIAdapter verwendet, aber nicht bei Verwendung mit IOLoop). Wenn Sie also mit WSGIAdapter arbeiten, können Sie Ihren WSGI-Server auf die gleiche Weise konfigurieren wie für jedes andere WSGI-Framework (normalerweise 1 Prozess pro CPU-Kern (vergleichbar mit HTTPServer.start(n)) und 5-10 Threads pro Prozess) abhängig davon, wie viel Zeit Sie in I/O verbringen).

Beachten Sie, dass tornado.httpclient.HTTPClient Objekte nicht thread-sicher sind, also müssen Sie eine Sperre setzen oder ein separates Objekt pro Thread verwenden.

+0

Also RequestHandler/HTTPRequest selbst sind Thread-Safe im Allgemeinen? (Muss ich Instanzvariablen sperren während zB: 'def prepare (self): self.x = self.request.get_arguments ('x')'?). In Bezug auf HTTPClient, wenn ich in einer RequestHandler-Methode lokal aufrufen und zuweisen ('def get (self): httpclient = HTTPClient (...) ...'), muss ich immer noch einen Threadlocal-Speicher sperren oder verwenden? – cowbert

+1

RequestHandler-Instanzen können nicht über Threads gemeinsam genutzt werden, aber in WSGI ist dies das übliche Modell. Der WSGI-Server weist Ihnen einen Thread zu und Sie können auf den Handler in diesem Thread zugreifen. Für HTTPClient, wenn Sie nur lokale Variablen verwenden, ist alles in Ordnung; Sie müssen nur sperren, wenn Sie Objekte über Threads hinweg freigeben. –

Verwandte Themen