Ich habe eine große schreibgeschützte Datenstruktur (ein in networkx geladenes Diagramm, obwohl dies nicht wichtig sein sollte), die ich in meinem Webdienst verwende. Der Webservice wird in Flask gebaut und dann durch Gunicorn bedient. Es stellt sich heraus, dass für jeden Gunicorn-Arbeiter, den ich angeheuert habe, eine eigene Kopie meiner Datenstruktur funktioniert. So wird meine ~ 700mb Datenstruktur, die perfekt mit einem Arbeiter handhabbar ist, zu einem ziemlich großen Speicherschwein, wenn ich 8 davon laufen lasse. Gibt es eine Möglichkeit, diese Datenstruktur zwischen Gunicorn-Prozessen zu teilen, so dass ich nicht so viel Speicher verschwenden muss?Gemeinsame Speicher in Gunicorn?
Antwort
Es sieht so aus, als ob tell gunicorn to preload your application mit der preload_app
Option der einfachste Weg ist. Dies setzt voraus, dass Sie die Datenstruktur als Variable auf Modulebene laden:
from flask import Flask
from your.application import CustomDataStructure
CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here')
# @app.routes, etc.
Alternativ können Sie ein memory-mapped file verwenden (wenn Sie den gemeinsam genutzten Speicher mit Ihrer benutzerdefinierten Datenstruktur wickeln kann), gevent with gunicorn um sicherzustellen, dass Sie Verwenden Sie nur einen Prozess oder the multi-processing module to spin up your own data-structure server, den Sie mit IPC verbinden.
Preload-Option funktioniert nicht, können Sie ein Beispiel für die Verwendung mit einer Dummy-Datenstruktur bereitstellen? – neel
@neel - Sie sind wahrscheinlich besser dran, eine andere Frage mit einem Beispiel für Ihre Einrichtung und was nicht funktioniert fragen. –
Ich habe die Frage hier http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn geschrieben Es wäre toll, wenn Sie schauen bei ihm einmal. Danke im Voraus. – neel
- 1. Gemeinsame Nutzung von Speicher zwischen zwei Prozessen (C, Windows)
- 2. gunicorn: FEHLER (keine solche Datei) nginx + gunicorn + supervisor
- 3. Heroku + gunicorn funktioniert nicht (bash: gunicorn: Befehl nicht gefunden)
- 4. Gunicorn Arbeiter Timeout
- 5. Django + gunicorn + systemd Probleme
- 6. Django Gunicorn Debug
- 7. Gunicorn worker timeout error
- 8. Syntaxfehler Installation gunicorn
- 9. Gunicorn Socket-Datei fehlt
- 10. Log Rotation mit Gunicorn
- 11. Gemeinsame Perlspeicher/Referenzleckmuster?
- 12. Gunicorn schafft Arbeiter in jeder Sekunde
- 13. Tornado vs wsgi (mit gunicorn)
- 14. Apache + mod_wsgi vs nginx + gunicorn
- 15. Gunicorn nicht statische Dateien dienen
- 16. Gunicorn sync Arbeiter laichen Prozesse
- 17. Anmelden bei Django und Gunicorn
- 18. Wie profiliere ich Django auf Gunicorn in Produktion
- 19. Falsche Anfrage 400: nginx/gunicorn
- 20. Gunicorn Upstart-Datei nicht gestartet
- 21. Gemeinsame Variablen in PostCSS
- 22. Gemeinsame Bibliothek in Go?
- 23. Teilen Sie eine Anzahl Array in Gunicorn Prozesse
- 24. effiziente längste gemeinsame Untersequenzalgorithmusbibliothek?
- 25. So erstellen Sie gemeinsame/gemeinsame Instanz in VBA
- 26. Wie kann der gemeinsame Speicher der GPU in Matlab verwendet werden?
- 27. Gemeinsame Speicheroptimierung
- 28. tensorflow speichern gemeinsame Variable in der Bibliothek
- 29. Gemeinsame CRUD-Funktionen in PHP
- 30. Gemeinsame Variablen in C++ 11
Haben Sie darüber nachgedacht, etwas wie Redis zu verwenden, um die Daten zu speichern und von jedem Prozess darauf zuzugreifen? Wäre der Geschwindigkeit so ähnlich wie Shared Memory. – nathancahill
Ich würde, aber wir sprechen über eine komplexe Grafik, dass es keine einfache Möglichkeit gibt, in Redis zu speichern (Redis hat keine gerichteten Kanten Graphen oder allgemeine Graph Unterstützung derzeit AFAIK). – Eli
Hat die Lösung für Sie funktioniert? Wenn ja, kannst du mich im Detail wissen, wie du es gemacht hast? – neel