Ein guter Multithread-Python-Webserver?

Ich suche einen Python-Webserver, der multithreaded ist, anstatt Multi-Prozess (wie im Fall von mod_python für Apache). Ich möchte, dass es multithreaded ist, weil ich einen im Speicherobjekt-Cache haben möchte, der von verschiedenen http-Threads verwendet wird. Mein Webserver macht viele teure Sachen und berechnet einige große Arrays, die im Speicher für die zukünftige Verwendung zwischengespeichert werden müssen, um das Rechnen zu vermeiden. Dies ist in einer Multi-Prozess-Webserverumgebung nicht möglich. Das Speichern dieser Informationen in memcache ist auch keine gute Idee, da die Arrays groß sind und sie im Memcache speichern, was zur Deserialisierung von Daten aus Memcache führen würde, abgesehen von dem zusätzlichen Overhead von IPC.

Ich habe einen einfachen Webserver mit BaseHttpServer implementiert, es gibt gute Leistung, aber es wird nach ein paar Stunden Zeit stecken bleiben. Ich brauche noch mehr reifen Webserver. Ist es möglich, Apache zu konfigurieren, um mod_python unter einem Thread-Modell zu verwenden, damit ich ein Objekt-Caching machen kann?

11 Solutions collect form web for “Ein guter Multithread-Python-Webserver?”

CherryPy Features, wie von der Website aufgeführt:

  • Ein schneller, HTTP / 1.1-kompatibler, WSGI-Thread-gepoolter Webserver. In der Regel nimmt CherryPy selbst nur 1-2ms pro Seite!
  • Unterstützung für jeden anderen WSGI-fähigen Webserver oder Adapter, einschließlich Apache, IIS, lighttpd, mod_python, FastCGI, SCGI und mod_wsgi
  • Einfache Ausführung mehrerer HTTP-Server (zB auf mehreren Ports) auf einmal
  • Ein leistungsfähiges Konfigurationssystem für Entwickler und Deployer gleichermaßen
  • Ein flexibles Plugin-System
  • Eingebaute Werkzeuge für Caching, Codierung, Sessions, Autorisierung, statischen Inhalt und vieles mehr
  • Ein nativer mod_pythonadapter
  • Eine komplette Test-Suite
  • Swappable und anpassbar … alles.
  • Eingebaute Profilierung, Abdeckung und Testunterstützung.

Erwägen Sie, Ihr Design zu überdenken. Die Aufrechterhaltung so viel Zustand in Ihrem Webserver ist wohl eine schlechte Idee. Multi-Prozess ist ein viel besserer Weg, um für Stabilität zu gehen.

Gibt es eine andere Möglichkeit, den Status zwischen den einzelnen Prozessen zu teilen? Was ist mit einem Service? Datenbank? Index?

Es scheint unwahrscheinlich, dass die Aufrechterhaltung einer riesigen Reihe von Daten im Speicher und die sich auf einen einzigen Multi-Thread-Prozess, um alle Ihre Anfragen zu dienen ist das beste Design oder Architektur für Ihre App.

Twisted kann als solcher ein Webserver dienen. Während es sich nicht multithreadiert hat, gibt es einen (noch nicht freigegebenen) Multithread-WSGI-Container, der im aktuellen Trunk vorhanden ist. Sie können das SVN-Repository ausprobieren und dann ausführen:

twistd web --wsgi=your.wsgi.application 

Es ist schwer, eine endgültige Antwort zu geben, ohne zu wissen, welche Art von Website Sie arbeiten und welche Art von Last Sie erwarten. Zweite Aufführung kann eine ernsthafte Anforderung sein oder es kann nicht sein. Wenn du diese letzte Millisekunde wirklich retten musst, musst du unbedingt deine Arrays im Gedächtnis halten. Jedoch wie andere haben vorgeschlagen, dass es mehr als wahrscheinlich ist, dass Sie nicht und könnte mit etwas anderes zu bekommen. Ihr Nutzungsmuster der Daten im Array kann beeinflussen, welche Arten von Entscheidungen Sie machen. Sie brauchen wahrscheinlich nicht den Zugriff auf die gesamte Menge von Daten aus dem Array auf einmal, so dass Sie Ihre Daten in kleinere Stücke brechen und legen Sie diese Stücke in den Cache statt der eine große Klumpen. Je nachdem, wie oft Ihre Array-Daten aktualisiert werden müssen, können Sie zwischen Memcached, Local Db (Berkley, sqlite, kleine MySQL-Installation usw.) oder einem Remote-Db wählen. Ich würde sagen, memcached für ziemlich häufige Updates. Eine lokale db für etwas in der Häufigkeit von stündlich und entfernt für die Häufigkeit der täglichen. Eine Sache zu beachten ist auch, was passiert nach einem Cache-Miss. Wenn 50 Clients plötzlich einen Cache-Miss bekommen und alle von ihnen gleichzeitig entscheiden, die regenerierenden jene teuren Arrays zu starten, wird dein Kasten schnell auf 8086 reduziert. Also musst du in die Rücksicht nehmen, wie du damit umgehen wirst. Viele Artikel draußen decken, wie man sich von Cache-Misses erholt. Hoffe das ist hilfreich.

Nicht multithreaded, aber verdreht könnte Ihren Bedürfnissen dienen.

Du könntest stattdessen einen verteilten Cache verwenden, der von jedem Prozess aus zugänglich ist, wobei das Beispiel das Beispiel ist, das in den Sinn kommt.

Web.py hat mich in der Vergangenheit glücklich gemacht. Betrachten Sie es auschecken.

Aber es klingt wie ein architektonisches Redesign könnte die richtige, aber teurer, Lösung sein.

Vielleicht hast du ein Problem mit deiner Implementierung in Python mit BaseHttpServer . Es gibt keinen Grund dafür, dass es "steckenbleiben" und die Implementierung eines einfachen Thread-Servers mit BaseHttpServer und threading sollte nicht schwierig sein.

Siehe auch http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer über die Implementierung eines einfachen Multi-Thread-Servers mit HTTPServer und ThreadingMixIn

Ich hatte vor kurzem das gleiche Problem. Nämlich: Wir haben einen einfachen Server mit BaseHTTPServer geschrieben und festgestellt, dass die Tatsache, dass es nicht Multi-Threaded war ein großer Nachteil.

Meine Lösung war, den Server an Pylons ( http://pylonshq.com/ ) zu portieren. Der Port war ziemlich einfach und ein Vorteil war, dass es sehr einfach ist, eine GUI mit Pylons zu erstellen, so dass ich in der Lage war, eine Statusseite zu werfen, was im Grunde ein Daemon-Prozess ist.

Ich würde Pylonen so zusammenfassen:

  • Es ist ähnlich wie Ruby on Rails, dass es sehr einfach ist, Web-Apps bereitzustellen
  • Es ist Standard-Templating-Sprache, Mako, ist sehr schön zu arbeiten mit
  • Es verwendet ein System von Routing-URLs, die sehr bequem ist
  • Für uns Leistung ist kein Problem, so kann ich nicht garantieren, dass Pylone würde angemessen für Ihre Bedürfnisse zu erfüllen
  • Du kannst es mit Apache & Lighthttpd benutzen, obwohl ich das nicht ausprobiert habe

Wir führen auch eine App mit Twisted und sind damit zufrieden. Twisted hat eine gute Leistung, aber ich finde Twisted's Single-Threaded / Defer-to-Thread Programmiermodell ziemlich kompliziert. Es hat viele Vorteile, aber wäre nicht meine Wahl für eine einfache App.

Viel Glück.

Ich benutze CherryPy sowohl persönlich als auch professionell, und ich bin sehr glücklich damit. Ich mache sogar die Art von Dingen, die du beschreibst, wie zum Beispiel mit globalen Objekt-Caches, mit anderen Threads im Hintergrund usw. Und es integriert sich gut mit Apache; Führen Sie einfach CherryPy als eigenständigen Server an localhost gebunden, dann verwenden Sie Apache's mod_proxy und mod_rewrite , damit Apache Ihre Anfragen transparent an CherryPy weiterleiten kann.

Die CherryPy Website ist http://cherrypy.org/

Nur um etwas anderes als die üblichen Verdächtigen hervorzuheben …

Vor einigen Jahren, während ich Zope 2.x verwendete, las ich über Medusa, wie es der Webserver für die Plattform war. Sie haben es beworben, um unter schweren Lasten gut zu funktionieren und es kann Ihnen die Funktionalität geben, die Sie gefragt haben.

  • Erstellen eines Python-Webservers - Layout und Setup
  • Python-Server "Nur eine Benutzung jeder Socket-Adresse ist normalerweise erlaubt"
  • Tornado oder Django arbeitet mit CGI?
  • Python-Skript senden Bild zu PHP
  • Python Fast Webserver
  • Wie man Python-Skript auf dem BaseHTTPSERVER ausführt, das von python erstellt wurde?
  • Wenn man Tornado benutzt, wenn man Twisted / Cyclone / GEvent / andere
  • OSError: [Errno 9] Schlechter Dateideskriptor in Python 3
  • Wie kann ich ein Python-Skript auf meinem Webserver ausführen?
  • Reverse Proxy fähige reine Python Webserver?
  • Websockets mit Tornado: Holen Sie sich Zugang von der "Außenseite", um Nachrichten an Kunden zu senden
  • Python ist die beste Programmiersprache der Welt.