用mongoengine运行uwsgi

时间:2015-12-19 10:53:23

标签: flask uwsgi mongoengine

当我在多进程模式下启动uwsgi时,它表示应该使用connect = False运行pymongo。如果我运行flask-mongoengine,我如何设置connect = False?

3 个答案:

答案 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