当我在多进程模式下启动uwsgi时,它表示应该使用connect = False运行pymongo。如果我运行flask-mongoengine,我如何设置connect = False?
答案 0 :(得分:3)
好吧,正如Ju-won lee所说,添加懒惰选项可以解决问题,但是如uwsgi文档中所述,它非常气馁:
http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html
uWSGI尽可能尝试(ab)使用fork()调用的Copy On Write语义。默认情况下,它会在加载应用程序之后进行分叉,以尽可能多地共享内存。如果出于某种原因不希望出现此行为,请使用lazy-apps选项。这将指示uWSGI在每个worker的fork()之后加载应用程序。请注意,有一个名为lazy的旧选项更具侵入性和高度劝阻(它仍然仅用于向后兼容)
因此,如果您想使用此选项,请更好地使用--lazy-apps。据我所知,问题是默认情况下,mongoengine for flask初始化只有一个分叉过程无法使用的连接(由于pymongo客户端的某些限制)。使懒惰应用程序的选择是为每个fork加载所有内容(使用更多内存)。
有一个装饰器,可以让你在prefork制作完成后运行代码。
只需添加到您的应用中:
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
我希望这个答案能增加一些说明!
答案 1 :(得分:0)
在你的uwsgi中使用lazy选项(--lazy) 具有多处理功能的mongoengine发生死锁.. :(
答案 2 :(得分:0)
https://github.com/MongoEngine/flask-mongoengine/blob/master/docs/index.rst
您可以使用 set connect=False 如下
app.config['MONGODB_SETTINGS'] = {
'host': 'mongodb://localhost/database_name',
'connect': False,
}
# or
app.config['MONGODB_CONNECT'] = False