Multi-threaded webserver von vs-single-threaded
Wir haben einen einfachen webserver für die interne Verwendung, die hat nur eine Aufgabe: überwachen der Anforderungen, Lesen Sie Sie, und schieben Sie die Daten in einer Datenbank. Die db-und webserver befinden sich beide auf der gleichen Maschine. Die db ist eine mysql-db und der server wird ein python-webserver (BaseHTTPServer.HTTPServer
) läuft das single-threaded.
Das problem ist, dass zwei Anträge können nicht behandelt werden, zur gleichen Zeit. Die Frage ist, würde es helfen, um die webserver multi-threaded (mit django, cheryypy,..)? Intuitiv ist der webserver nur die Durchführung CPU zeitraubenden Aufgaben, so ändern Sie ihn auf "multi-threaded" sollte nicht helfen. Ist das richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mehrere threads oder Prozesse werden in der Tat helfen (in der Tat ist es in der Praxis erforderlich sind), wenn Sie möchten, um mehr als eine Anforderung zu einem Zeitpunkt.
Das bedeutet nicht, dass die beiden Anträge behandelt werden schneller. Mit einem pool von Prozessen oder threads ist sehr hilfreich für die webserver-performance, aber das ist nicht wirklich bemerkbar in Fällen wie diesem (es sei denn, Sie haben mehrere Kerne). Aber MySQL hat kein problem Umgang mit zwei Anfragen zur gleichen Zeit, also, wenn Ihr webserver kann es auch tun, dann werden Sie loszuwerden, das problem der Umgang mit nur einer Anfrage.
Aber wenn es die Mühe Wert, um zu starten mit so einem server, die nur Sie beantworten können. 🙂 Django ist sicherlich übertrieben, in jedem Fall, sich an einige kleine WSGI-server.
Schritt 1. Apache Verwenden. Es mag wie overkill, aber es ist Billig, multi-threading ohne Programmierung auf Ihrem Teil. Kann der Apache konfiguriert werden, um die Gabel aus mehreren Servern. Keine Programmierung auf Ihrem Teil.
Kann dies ausreichend sein, um Ihre Anwendung gleichzeitig laufen.
Schritt 2. Schreiben Sie Ihre Anwendung verwenden, die wsgi-Rahmen und Betten es in die
wsgiref
server. Dies wird nicht viel ändern, aber es ist so, wie Sie sollte immer schreiben Sie kleine web-Anwendungen.Schritt 3. Verwenden mod_wsgi im Apache. Es erlaubt Ihnen, ein oder mehrere hintergrund-daemon-Versionen Ihrer Anwendung. Mit keine zusätzliche Programmierung bekommen Sie einen Haufen Parallelität zur Verfügung.
Wichtige Lektion gelernt. Verwenden Sie immer WSGI.
Mein Instinkt sagt-du hast Recht, aber er sagt auch, dass mit Django oder Cherrypy ist weit übertrieben, auch wenn Sie nicht wollen, um Multithreading zu machen.
Ich denke, du hast Recht, obwohl, da, wenn der webserver auch wirklich nicht tun etwas anderes als das arbeiten mit einer DB, dann kann jeder andere thread wäre nicht in der Lage etwas anderes zu tun als Anfang einer Antwort. Der client wird gerne warten, die zehn bis hundert ms notwendig für die anderen-Anforderung zu beenden, und dann wird der server in der Lage sein, um
accept()
sofort.Wenn der Web-server wird von single-threaded-und DB-Anfragen sind synchrone (d.h. der Web-server wird blockiert, während die DB-Anfrage bearbeitet wird) dann macht es die multi-threaded helfen würde.
Dies würde es ermöglichen, Sie zu verarbeiten mehrerer Aufträge gleichzeitig. Ihre DB-engine ist wahrscheinlich ganz gut. Aber jetzt bist du nicht lassen es zu mehrere Anträge gleichzeitig, da Sie den Web-server direkt, dass es nur füttert es eine Anfrage an ein Zeit.
Sollten Sie gehen für Multithreading und asynchrone webserver, da sonst jede Anfrage blockiert wird. Django ist ein web-framework, haben Sie vielleicht zu suchen für Skripte, die Sie transparent ersetzen Sie in Ihrem aktuellen setup und haben noch Ihr reines python Multithread-webserver. Ansonsten twisted ist eine gute Lösung auch. AFA kann ich sehen, Sie können nicht wollen, ein Web-Framework, weil Sie nicht tun, ein template-driven MVC-Stil-app.