Обмен изменяемыми данными между работниками Flask - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть приложение Flask с некоторыми изменяемыми пользователем значениями конфигурации, которые хранятся в базе данных.Значения не будут часто меняться, поэтому я не хочу получать их из базы данных каждый раз, когда получаю запрос (значения необходимы для каждого запроса), но мне также нужны изменения, чтобы немедленно распространить их на всех работников.

Для решения этой проблемы я предложил два основных подхода:

  1. Каким-то образом есть общая локальная копия значений, которые могут быть изменены каждым работником.Затем, когда пользователь изменяет значение, работник обновляет базу данных и локальную переменную.shelve может быть хорошим вариантом для этого подхода.
  2. Каким-то образом уведомите каждого работника о необходимости перезагрузки значений из базы данных.

Что было бы лучшим способом сделатьэто?

(Примечание: приложение обслуживается Gunicorn на Heroku Hobby Dyno.)

1 Ответ

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

В конце я узнал о модуле Python multiprocessing, который обеспечивает, среди прочего, довольно простой способ распределения памяти между процессами.

В моем случае мне нужно было поделиться строкой, поэтому яинициализирует общую строку с

import multiprocessing as mp
...
shared_str = mp.Array('c', 100)

. Это создает оболочку для общей c-строки длиной 100. Конструктор multiprocessing.Array принимает аргумент типа (либо класс ctypes, либо тип ).-кода и длина. Затем я могу получить доступ к общей строке с помощью shared_str.value.

Я запускаю gunicorn с параметром --preload, поэтому разделяемая память выделяется, когда мое приложениесоздан, и тогда каждый процесс может получить к нему доступ со своей собственной копией shared_str.

. Этот метод будет работать и для других ctypes объектов (и даже не ctypes объектов, используя pickleСм. Документацию для multiprocessing здесь и, в частности, подмодуль sharedctypes .

...