Запуск 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 шт):
Гуникорн запускает форкеров через os.fork(). Из-за этого Вы получаете копию class1 вместо ссылки. Мультипроцессинг Менеджер наверное тоже не подойдет потому как тут не запускаются механизмы мастер-клиент.
Остается шаред мемори, который не удобен для объектоориентированного доступа, и file,socket,pipe - которые общие для форков - на них и приходится реализовывать обмен информацией между воркерами.
Но рекомендую запустить внешнее хранилище объектов на memcached или redis.