Mam dużą strukturę danych tylko do odczytu (wykres załadowany w siecix, choć to nie powinno być ważne), którego używam w moim serwisie internetowym. Usługa internetowa jest wbudowana w Flask, a następnie obsługiwana przez Gunicorn. Okazuje się, że dla każdego pracownika Gunicorn, który się rozpędzam, to działa, posiada własną kopię mojej struktury danych. Tak więc moja struktura danych ~ 700mb, która jest doskonale zarządzalna z jednym robotnikiem zamienia się w całkiem sporą pamięć, kiedy mam 8 uruchomionych. Czy istnieje sposób, w jaki mogę dzielić tę strukturę danych pomiędzy procesami gunicorn, więc nie muszę marnować tak dużo pamięci?Udostępnianie pamięci w Gunicorn?
Odpowiedz
Wygląda na to, że najprościej to zrobić: tell gunicorn to preload your application przy użyciu opcji preload_app
. Zakłada się, że można załadować strukturę danych jako zmienną moduł poziomie:
from flask import Flask
from your.application import CustomDataStructure
CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here')
# @app.routes, etc.
Alternatywnie, można użyć memory-mapped file (jeśli można owinąć pamięci współdzielonej z niestandardowej struktury danych), gevent with gunicorn aby zapewnić, że używa się tylko jednego procesu lub the multi-processing module to spin up your own data-structure server, z którym łączy się za pomocą IPC.
Opcja wstępnego ładowania nie działa, czy możesz podać przykład użycia jej z pewną sztuczną strukturą danych? – neel
@neel - prawdopodobnie lepiej zadać inne pytanie z przykładem konfiguracji i niedziałającą. –
Wysłałem pytanie tutaj http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn Byłoby świetnie, gdybyś wyglądał w tym momencie. Z góry dziękuję. – neel
- 1. Udostępnianie tablicy numpy w procesach gunicorn
- 2. Udostępnianie blokady między pracownikami gunicorn
- 3. Udostępnianie statycznych danych globalnych pomiędzy procesami w aplikacji Gunicorn/Flask
- 4. Udostępnianie pamięci między modułami
- 5. Udostępnianie pamięci RDMA
- 6. Udostępnianie obiektu między pracownikami Gunicorn lub utrzymywanie obiektu wewnątrz pracownika
- 7. Udostępnianie obrazów przechowywanych w pamięci wewnętrznej
- 8. Udostępnianie fałszywe w C++
- 9. Jak profilować Django na Gunicorn w produkcji
- 10. Heroku + nie gunicorn pracy (bash: gunicorn: nie znaleziono polecenia)
- 11. Django Gunicorn Debugowanie
- 12. Gunicorn nie odpowiada
- 13. Limit czasu pracownika Gunicorn
- 14. Błąd składni instalacji gunicorn
- 15. Udostępnianie obszarów pamięci między pracownikami selera na jednym komputerze
- 16. Jak zatrzymać gunicorn poprawnie
- 17. Fałsz Udostępnianie i Zmienne atomowe
- 18. Udostępnianie strukturalne w Clojure
- 19. Gunicorn Django i rejestrowanie informacji w pliku
- 20. Połączenie Gunicorn w użyciu: ("0.0.0.0", 5000)
- 21. Apache + mod_wsgi kontra nginx + gunicorn
- 22. gunicorn nie obsługuje plików statycznych
- 23. Udostępnianie w Whatsapp w AngularJS
- 24. Udostępnianie cech w różnych fabrykach
- 25. Udostępnianie obiektów w procesach Java
- 26. Udostępnianie adresu URL w aplikacji internetowej
- 27. Docker: w systemie plików pamięci
- 28. python: udostępnianie ogromnych słowników przy użyciu wieloprocesowości
- 29. Django - gunicorn - zmienna poziomu aplikacji (wspólna dla pracowników)
- 30. Django z Gunicorn różnymi sposobami wdrażania
Czy rozważałeś użycie czegoś takiego jak Redis do przechowywania danych i dostępu do nich z każdego procesu? Byłoby bardzo podobne do wspólnej pamięci, jeśli chodzi o prędkość. – nathancahill
Chciałbym, ale mówimy o skomplikowanym wykresie, który nie ma łatwego sposobu przechowywania w Redis (Redis nie ma obecnie ukierunkowanych grafów krawędzi lub ogólnego wsparcia AFAIK). – Eli
Czy to rozwiązanie działa? Jeśli tak, możesz mi powiedzieć dokładnie, jak to zrobiłeś? – neel