Frage

Ich bin für ein Python-Webserver, die anstelle des Seins Multi-Prozess-multithreaded (wie im Fall von mod_python für Apache). Ich will es multithreaded sein, weil ich eine im Speicher Objekt-Cache haben will, das von verschiedenen http Threads verwendet werden. Mein Webserver hat eine Menge teuren Sachen und berechnet einige großen Arrays, die für eine spätere Verwendung im Arbeitsspeicher zwischengespeichert werden muss Neuberechnung zu vermeiden. Dies ist nicht möglich, in einer Multi-Prozess-Web-Server-Umgebung. auch keine gute Idee ist, diese Informationen in memcache Speicher als die Arrays sind groß und sie in memcache Speicherung würde Deserialisierung von Daten führt von memcache kommen abgesehen von dem zusätzlichen Overhead von IPC.

I implementiert einen einfachen Webserver mit BaseHttpServer es eine gute Leistung gibt, aber es wird nach wenigen Stunden fest. Ich brauche etwas mehr gereift Webserver. Ist es möglich, Apache zu konfigurieren mod_python unter einem Thread-Modell zu verwenden, so dass ich einige Objekt-Caching zu tun?

War es hilfreich?

Lösung

CherryPy . Features, wie aus der Website:

  • Ein schneller, HTTP / 1.1-konform, WSGI fade gepoolt Webserver. Typischerweise CherryPy selbst dauert nur 1-2ms pro Seite!
  • Unterstützung für andere WSGI-fähigen Webserver oder Adapter, einschließlich Apache, IIS, lighttpd, mod_python, FastCGI, SCGI und mod_wsgi
  • Einfache mehr HTTP-Server (beispielsweise auf mehr Ports) auf einmal
  • laufen
  • Ein leistungsfähiges Konfigurationssystem für Entwickler und Anwender gleichermaßen
  • Ein flexibles Plugin-System
  • Integrierte Tools für Caching, Codierung, Sitzungen, Autorisierung, statische Inhalte, und viele mehr
  • Eine native Mod_python Adapter
  • Eine komplette Testsuite
  • Swappable und anpassbaren ... alles.
  • Einbau-Profilerstellung, Berichterstattung und Prüfung zu unterstützen.

Andere Tipps

Betrachten Sie Ihr Design überdenken. dass viel Staat in Ihrem Webserver zu erhalten ist wahrscheinlich eine schlechte Idee. Multi-Prozess ist ein viel besserer Weg für Stabilität zu gehen.

Gibt es eine andere Art und Weise Zustand zwischen separaten Prozessen zu teilen? Was ist mit einem Service? Datenbank? Index?

Es scheint unwahrscheinlich, dass eine große Anzahl an Daten im Speicher zu erhalten und auf einem einzigen Multi-Threaded-Prozess verlassen alle Ihre Anfragen zu bedienen ist das beste Design oder Architektur für Ihre App.

Verdrehte kann als solche einen Web-Server dienen. Obwohl nicht selbst multithreaded, gibt es einen (noch nicht erschienen) multithreaded WSGI Behälter in dem aktuellen Stamm. Sie können das SVN-Repository auschecken 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, die Sie gerade arbeiten und welche Art von Last, die Sie erwarten. Sub zweite Leistung kann eine ernsthafte Forderung sein oder auch nicht. Wenn Sie wirklich die letzte Millisekunde speichern müssen, dann müssen Sie unbedingt Ihre Arrays im Speicher zu halten. Doch wie andere vorgeschlagen haben, ist es mehr als wahrscheinlich, dass Sie dies nicht tun und mit etwas anderem auskommen könnte. Ihre Nutzungsmuster der Daten in dem Array können beeinflussen, welche Arten von Entscheidungen, die Sie machen. Sie müssen wahrscheinlich keinen Zugriff auf den gesamten Satz von Daten aus dem Array auf einmal, so dass Sie Ihre Daten in kleinere Stücke bis brechen könnte und diese Stücke in den Cache stellen anstatt des einen großen Klumpen. Je nachdem, wie oft Sie Ihre Array-Daten aktualisiert zu werden brauchten, könnten Sie die Wahl zwischen Memcached, lokalem db (Berkley, SQLite, kleiner MySQL-Installation, etc.) zu machen oder einen Remote-db. Ich würde sagen, für ziemlich häufiges Updates Memcached. Eine lokale db für etwas in der Häufigkeit von Stunden- und Fernbedienung für die Frequenz von täglich. Eine Sache zu prüfen ist auch, was nach einer Cache-Miss passiert. Wenn 50 Kunden ganz plötzlich eine Cache-Miss und sie alle zur gleichen Zeit bekommen entscheidet das teuere Arrays Ihre Box (en) zu starten Regenerieren wird schnell zu 8086 sind reduziert werden. Also muss man in Betracht ziehen, um, wie Sie damit umgehen werden. Viele Artikel da draußen behandelt, wie von Cache-Misses zu erholen. Hoffe, das ist hilfreich.

Nicht multithreaded, aber verdrehte könnten Ihre Anforderungen.

Sie könnten stattdessen einen verteilten Cache verwenden, die von jedem Prozess zugänglich ist, wobei das Beispiel Memcached dass in dem Sinne.

web.py hat mich in der Vergangenheit glücklich gemacht. Betrachten wir die Überprüfung it out.

Aber es klingt wie eine architektonische Neugestaltung könnte die richtige, wenn auch teurer, Lösung sein.

Vielleicht haben Sie ein Problem mit der Implementierung in Python mit BaseHttpServer. Es gibt keinen Grund dafür „stecken bleiben“, und einen einfachen Gewinde Server Implementierung BaseHttpServer und threading verwenden sollte nicht schwierig sein.

Auch finden Sie unter http://pymotw.com/2/BaseHTTPServer/ index.html # Modul-BaseHTTPServer über einen einfachen Multi-threaded-Server mit HTTPServer Implementierung und ThreadingMixIn

Ich CherryPy verwenden sowohl persönlich als auch professionell, und ich bin sehr zufrieden mit ihm. Ich mache auch die Art der Sache, die Sie beschreiben, wie globale Objekt-Caches mit, andere Threads im Hintergrund laufen, etc. Und es integriert sich gut mit Apache; einfach laufen CherryPy als ein eigenständiger Server auf localhost gebunden, dann Apache mod_proxy und mod_rewrite verwenden Apache haben transparent uns auf Ihre Anfrage CherryPy.

Die CherryPy Website http://cherrypy.org/

Ich hatte eigentlich das gleiche Problem vor kurzem. Nämlich:. Schrieben wir einen einfachen Server BaseHTTPServer mit und stellten fest, dass die Tatsache, dass es nicht multi-threaded ist ein großer Nachteil war

Meine Lösung war, in den Hafen der Server Pylons ( http://pylonshq.com/ ). Der Hafen war ziemlich einfach und ein Vorteil war es sehr einfach, eine GUI mit Pylonen zu schaffen, damit ich in der Lage war, eine Statusseite oben zu werfen, was ist im Grunde ein Daemon-Prozess.

Ich würde zusammenfassen Pylons auf diese Weise:

  • es ist ähnlich wie Ruby on Rails, dass es sehr einfach sein will Web-Anwendungen bereitstellen
  • es ist Standard-Template-Sprache, Mako, ist sehr schön, mit zu arbeiten
  • es verwendet ein System Urls von Routing, die sehr bequem ist
  • für uns Verkehr kein Problem ist, so kann ich nicht garantieren, dass Pylone ausreichend für Ihre Bedürfnisse erfüllen würde
  • Sie können es mit Apache & Light verwenden, wenn ich diese
  • nicht versucht haben,

Wir haben auch eine App mit Verdreht und sind glücklich mit ihm laufen. Twisted hat eine gute Leistung, aber ich finde Twisted Single-threaded / defer-to-Thread-Programmiermodell ziemlich kompliziert. Es hat viele Vorteile, aber wäre nicht meine Wahl für eine einfache Anwendung sein.

Viel Glück.

Nur etwas anders als die üblichen Verdächtigen, darauf hinzuweisen ...

Vor einigen Jahren, während ich mit Zope 2.x ich gelesen Medusa wie es der Web-Server für die Plattform verwendet wurde. Man wirbt sie auch unter hoher Last zu arbeiten, und es können Sie mit der Funktionalität bieten Ihnen gefragt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top