Запуск Flask через gunicorn с общим объектом

Всем привет. Такой вопрос возник из-за странного поведения программы.

Есть скрипт на Flask примерно условно такой

class1 = SuperClass()

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index(username):
   result = class1.func()
   class1.val = result + 1
   return result

И это запускается через gunicorn

gunicorn --bind=0.0.0.0:8800 -k gevent --workers=6 --timeout=33 server:app

Правильно ли я понимаю, что объект класса class1 = SuperClass() будет использоваться ОДИН во всех воркерах? И соответственно возникнет конфликт, если внутренние переменные классы будут изменяться в func()?

Как правильно сделать?


Ответы (1 шт):

Автор решения: eri

Гуникорн запускает форкеров через os.fork(). Из-за этого Вы получаете копию class1 вместо ссылки. Мультипроцессинг Менеджер наверное тоже не подойдет потому как тут не запускаются механизмы мастер-клиент.

Остается шаред мемори, который не удобен для объектоориентированного доступа, и file,socket,pipe - которые общие для форков - на них и приходится реализовывать обмен информацией между воркерами.

Но рекомендую запустить внешнее хранилище объектов на memcached или redis.

→ Ссылка