2012-06-09 7 views
7

Ich verstehe Tornado ist ein Single-Threaded und nicht-Blocking-Server, Anfragen werden daher sequentiell behandelt (außer bei Verwendung ereignisgesteuerter Ansatz für IO-Betrieb).Ist Nebenläufigkeit im Tornado möglich?

Gibt es eine Möglichkeit, mehrere Anfragen parallel in Tornado für normale (Nicht-IO) Ausführung zu bearbeiten. Ich kann mehrere Prozesse nicht abzweigen, da ich einen gemeinsamen Speicherbereich für alle Anforderungen benötige.

Wenn es nicht möglich ist, schlagen Sie mir bitte andere Python-Server vor, die parallele Anforderungen verarbeiten können und auch wsgi unterstützen.

Antwort

7

Wenn Sie wirklich mit mehreren gleichzeitigen Anfragen arbeiten, die rechenintensiv sind, und Sie es in Python machen wollen, dann brauchen Sie einen Multi-Prozess-Server, nicht Multithreading. CPython verfügt über eine globale Interpreter-Sperre (GIL), die verhindert, dass mehr als ein Thread gleichzeitig Python-Bytecode ausführen kann.

Die meisten Webanwendungen führen nur sehr wenig Berechnungen durch und warten stattdessen auf E/A, entweder von der Datenbank oder der Festplatte oder von Diensten auf anderen Servern. Stellen Sie sicher, dass Sie mit compute-gebundenen Anfragen umgehen müssen, bevor Sie Tornado löschen.

5

Die Antwort auf Ihre Frage hängt wirklich davon ab, wie lange diese rechenintensiven Threads laufen werden. Wenn sie kurz laufen und die Bearbeitungsrate mindestens der Rate entspricht, mit der sie ankommen, wird Tornado gut ankommen. Es ist wirklich single-threaded, aber es skaliert sehr gut.

Wenn Ihre rechenintensiven Anforderungen lange andauern, hilft die Verwendung eines Threading-Servers nicht unbedingt, da, wie Ned Batchelder bereits sagte, die GIL ein Engpass sein wird. Wenn Sie in der Lage sind, die Einschränkung des gleichen Speicherplatzes für alle Anforderungen zu lockern, sollten Sie Tornado mit PyZMQ ausführen, da es eine Möglichkeit bietet, mehrere Tornado-Backends mit einer einzigen Tornado-Instanz auszuführen . Auf diese Weise können Sie Tornado weiterhin für die gesamte Lösung verwenden. Weitere Informationen finden Sie im PyZMQ-Modul web.zmqweb.

+0

Danke für Ihre Antworten. Ich kenne GIL nicht. Also keine Möglichkeit, parallele Prozesse mit Threads in CPython zu machen und ich muss mit Multi-Prozess gehen. – Adhi

+1

Sie können die parallele Verarbeitung in Python durchführen, aber Sie werden nicht alle Ihre Ressourcen verwenden, da Sie beim Ausführen von Python-Code nur 1 CPU pro Python-Prozess verwenden. Sie können also Threads für den gemeinsamen Zugriff verwenden, aber die verfügbaren Leistungsgewinne sind begrenzt. Aber die meiste Zeit wird Tornado auf I/O warten, also gibt es viel zu gewinnen, zum Beispiel durch Threading. –

+0

zmqweb wurde aus PyZMQ in ein eigenes Projekt gezogen: https://github.com/ellisonbg/zmqweb –