Когда я запускаю uwsgi в многопроцессорном режиме, он говорит, что pymongo должен запускаться со связью = False. Как я могу установить connect = False, если я запускаю flask-mongoengine?Запуск uwsgi с mongoengine
ответ
использовать ленивый вариант (--lazy) в вашем uwsgi.
mongoengine с многопроцессорной происходит тупиковой .. :(
Ну, как говорит Ju-вона подветренной, добавив опцию ленивым решает эту проблему, но настоятельно рекомендуется, как указано в документации uwsgi:
http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html
UWSGI пытается (ab) использовать семантику копирования On Write для вызова fork() по возможности. По умолчанию он будет работать после того, как вы загрузили ваши приложения, чтобы как можно больше их памяти. Если это поведение нежелательно по какой-то причине, используйте опцию ленивых приложений. Это даст указание uWSGI загрузить приложение после каждой вилки работника(). Берегитесь, как есть старые варианты, названные лениво, что путь более инвазивная и крайне нежелательно (он все еще здесь только для обратной совместимости)
Таким образом, в случае, если вы хотите использовать эту опцию лучше использовать --lazy-приложение , Насколько я понимаю, проблема в том, что по умолчанию mongoengine for flask инициализирует только одно соединение, которое разветвленные proceses не могут использовать (из-за некоторых ограничений в клиенте pymongo). Что делает вариант ленивых приложений - загружать все для каждой вилки (которая использует больше памяти).
Существует декоратор, который позволяет запускать код сразу после создания предка.
Просто добавьте в ваше приложение:
from flask.ext.mongoengine import MongoEngine
from uwsgidecorators import postfork
app = Flask(__name__)
# do whatever you want with the application
db = MongoEngine() # set db as MongoEngine (without any app or configuration)
@prefork
def setup_db():
db.init_app(app) # this code actually calls to "connect" in pymongo
# define the rest of calls, etc
Я надеюсь, что этот ответ добавляет некоторые разъяснения!
Если декоратор на setup_db() в вашем примере кода будет @postfork, а не @prefork? –