Можно ли разделить память между процессами UWSGI, работающими с приложением колбы? - PullRequest
0 голосов
/ 10 января 2019

Я хочу знать, может ли приложение фляги, работающее на uwsgi с несколькими процессами + потоками, иметь доступ к общей структуре данных памяти, определенной в классе приложения Flask.

Что я пытаюсь сделать: У меня есть приложение фляги, которое будет работать на nginx + uwsgi. Я хочу, чтобы каждый http-запрос имел доступ к некоторым данным, которые лежат в базе данных etcd. Тем не менее, это медленно. Чтобы ускорить ответы http, я думаю о загрузке данных из БД в память приложения колбы при запуске приложения колбы. Поэтому при каждом запросе эти данные могут быть быстро доступны из локальной памяти вместо запроса etcd.

Как я пытаюсь это сделать: Я определил свой собственный класс Flaskapp и унаследовал его от «Flask» и переопределил « init » для загрузки состояния предварительного запуска:

class FlaskApp(Flask):

    def __init__(self, *args, **kwargs):
        self.populate_info() # This function will load stuff
        super(FlaskApp, self).__init__(*args, **kwargs)
    def populate_info(self):
        self.stuff = []
        #load stuff from db to self.stuff

Будет ли каждый запрос на флягу читать self.stuff? Исходя из C ++ фона, насколько я понимаю, это зависит от того, как uwsgi запускает приложение фляги. Поэтому мне нужен ответ: 1) Каждый ли процесс uwsgi создает приложение Flask? 2) Или uwsgi создает экземпляр экземпляра приложения Flask один раз в памяти, разделяет его между всеми процессами, а затем каждый процесс вызывает только обработчики запросов http этого экземпляра для каждого запроса? Я попытался найти документацию, чтобы понять, как uwsgi планирует это, но не смог найти достаточно информации, чтобы понять это. Так что оценю любую помощь. Если это совместное использование памяти не будет работать (что я догадываюсь), каков альтернативный способ сделать это? Благодаря.

1 Ответ

0 голосов
/ 24 января 2019

После более глубокого изучения документов uwsgi я обнаружил, что существует 2 режима работы uwsgi:

  1. Предварительная разветвленность: это режим по умолчанию. В этом режиме один основной процесс загружает приложение, а рабочие процессы затем разветвляются из этого основного процесса. Это приводит к тому, что рабочие имеют ту же память, что и основной процесс, пока они не изменят память. семантика копирования при записи соблюдается в этом случае. Таким образом, в этом контексте, ссылаясь на мой код, состояние, которое я загружаю при запуске приложения, будет доступно всем работникам, пока они не изменят его.
  2. Ленивые приложения: в этом режиме каждый рабочий процесс загружает свое собственное приложение, и, следовательно, в контексте моего кода populate_info будет вызываться каждым рабочим. Но это, конечно, не очень эффективно для памяти.

Я нашел эту ссылку полезной: https://engineering.ticketea.com/uwsgi-preforking-lazy-apps/

...