2013-08-30 9 views
10

Ich hatte einen Multithread-Webserver mit dem Flask Micro Framework implementiert. Grundsätzlich hat mein Server eine Aufgabenwarteschlange und einen Thread-Pool. Daher kann es mehrere Anforderungen verarbeiten. Da Flask in Python implementiert ist und Python-Threads nicht wirklich gleichzeitig sind, ist meine Web-App ein wenig verzögert.Kolben Alternativen zu wahren Multithreading?

Gibt es Alternativen zu Flask, um das Problem des Multithreading zu lösen?

+1

In welcher Weise setzen Sie Flask um? Es wäre nicht so sehr auf Flask selbst. –

+1

Denken Sie daran, dass Multithreading in Python sehr gut für das geeignet ist, was Sie versuchen. Die "verzögerten" Teile Ihrer Ansicht können beispielsweise Web-Service- oder Datenbankaufrufe oder ein falsch konfigurierter Webserver sein, der für jede Anforderung einen Python-Prozess erstellt. Was auch immer das eigentliche Problem ist, wir wissen nicht, was es ist, Ihnen zu helfen, es mit den Details zu lösen, die Sie gegeben haben. Wenn Sie nach einer Alternative zu Flask fragen, fragen Sie im Grunde nach Empfehlungen für ein Tool, für die StackOverflow aufgrund der vielen möglichen Antworten keine Frage ist. –

+0

Wie Sie erwähnt haben, erstelle ich pro Anfrage einen Prozess. Aber ich kann es nicht vermeiden, weil der Webservice ein Text-zu-Sprache-System (TTS) freilegt, das als separate Binärdatei implementiert ist. Um mit dem TTS-Prozess zu interagieren, verwende ich das Pexpect-Modul. So erzeugt ein existierender freier Thread aus dem Thread-Pool pro Anfrage einen TTS-Prozess mit pexpect. Ich weiß, dass Design etwas seltsam ist. Hier ist der Link zur aktuellen Implementierung http://sitspeech.iitkgp.ac.in/. Ich schätze jeden Vorschlag zur Verbesserung des aktuellen Designs. – user2586432

Antwort

7

Dies ist nicht Flasks Fehler, es ist eine Einschränkung im Python-Interpreter, so dass jedes Framework, das Sie verwenden, unterliegen wird.

Aber es gibt eine gute Möglichkeit, dieses Problem zu vermeiden. Um echte Übereinstimmung zu haben, können Sie einen Pool von Prozessen anstelle von Threads verwenden. Das multiprocessing-Modul stellt eine API bereit, die mit der des Threadingmoduls kompatibel ist, erstellt jedoch untergeordnete Prozesse für die Worker. Ich habe dieses Modul verwendet, um Hintergrundarbeiter für Flask-Anwendungen zu erstellen, die sich als sehr gut erwiesen haben.

22

Ich bin auf diese Frage gestoßen und ich war ein wenig enttäuscht, niemand hatte darauf hingewiesen, wie Kolben (und die meisten Python-Web-Anwendungen sind gemeint zu implementieren). Siehe: http://flask.pocoo.org/docs/deploying/#deployment

Meine bevorzugte Implementierungsoption ist die super-einfache Tornado, die auf Linux gleichermaßen gut funktioniert und von Windows (wenn ich die Bereitstellung es neben den bestehenden Websites oder sogar eine Hybridbereitstellung im Rahmen einer bestehenden Website, ich Normalerweise verwende ich IIS Application Request Routing [ARR] als Reverse Proxy für Tornado). Ich habe auch gevent auf beiden mit großem Erfolg verwendet.

Tornado ist eine Open-Source-Version des skalierbaren, blockierungsfreien Webservers und Tools, die FriendFeed unterstützen. Da es nicht blockierend ist und epoll verwendet, kann es tausende gleichzeitig bestehender Verbindungen verarbeiten, was bedeutet, dass es ideal für Echtzeit-Webdienste ist. Die Integration dieser Service mit Flask ist einfach:

Also, wenn Ihr Kolben Anwendung in yourapplication.py ist, könnte man eine andere namens tornado_web.py zu erstellen und verwenden, um Ihre Anwendung zu dienen, wie so:

from tornado.wsgi import WSGIContainer 
from tornado.httpserver import HTTPServer 
from tornado.ioloop import IOLoop 
from yourapplication import app 

http_server = HTTPServer(WSGIContainer(app)) 
http_server.listen(5000) 
IOLoop.instance().start() 

über: http://flask.pocoo.org/docs/deploying/wsgi-standalone/#tornado

+0

Ich habe gerade installiert Tornado auf meiner App (Staright Forward wie gesagt), aber ich vermisse die hilfreichen Logs des Standard-Server-Flasher mit den Aufrufen auf der Konsole in Relative - wissen Sie, wie dies in Tornado getan werden kann? @Aaoron –