Mam aplikację Flask działającą pod kontrolą Gunicorn, używając typu procesu synchronizacji z 20 procesami roboczymi. Aplikacja odczytuje wiele danych podczas uruchamiania, co zabiera czas i wykorzystuje pamięć. Co gorsza, każdy proces ładuje swoją własną kopię, co powoduje, że trwa jeszcze dłużej i zabiera 20X pamięci. Dane są statyczne i nie ulegają zmianie. Chciałbym załadować go raz i udostępnić go wszystkim 20 pracownikom.Udostępnianie statycznych danych globalnych pomiędzy procesami w aplikacji Gunicorn/Flask
Jeśli używam ustawienia preload_app
, ładuje się tylko w jednym wątku i początkowo zajmuje tylko 1X pamięci, ale wydaje się baloon do 20X, gdy żądania przychodzą. Potrzebuję szybki losowy dostęp do danych, więc " d raczej nie należy wykonywać IPC.
Czy istnieje sposób na udostępnianie danych statycznych w procesach Gunicorn?
Chyba powinienem powiedzieć, że chciałem podzielić się normalnym dyktando Pythona, a nie tylko kroplą pamięci. –
@DoctorJ Więc nie masz szczęścia. Powodem jest to, że struktura danych Pythona to tylko wskaźniki do wskaźników w pamięci, które będą obejmować wiele stron. Większość z tych stron zostanie również udostępniona wraz z danymi, do których została zapisana, dlatego kopiowanie przy zapisie powoduje, że strony są duplikowane w każdym procesie. Polecam używanie magazynu obiektów lub magazynu klucz-wartość, takiego jak Redis - jest to "standardowe" rozwiązanie tego problemu. IPC na localhost jest bardzo szybki, prawdopodobnie optymalizujesz się przedwcześnie, jeśli uważasz, że będzie to wąskie gardło. – aaa90210