当我在多进程模式下启动uwsgi时,它告诉我pymongo应该与connect=False一起运行。如果我运行flask-mongoengine,我如何设置connect=False?
发布于 2016-05-02 06:19:15
嗯,正如Ju-won lee所说,添加选项lazy解决了问题,但正如uwsgi文档中所指出的那样,它是非常不受欢迎的:
http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html
只要有可能,
uWSGI就会尝试使用fork()调用的写入时复制语义。默认情况下,它将在加载应用程序后派生,以尽可能多地共享它们的内存。如果由于某种原因,这种行为是不可取的,那么可以使用lazy-apps选项。这将指示uWSGI在每个工作线程的fork()之后加载应用程序。当心,因为有一个名为lazy的旧选项,它更具侵入性,也非常不受欢迎(它仍然存在,只是为了向后兼容)
所以,如果你想使用这个选项,最好使用--lazy-apps。据我所知,问题是默认情况下,flask的mongoengine只初始化一个分支进程无法使用的连接(由于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 我希望这个答案能澄清一些问题!
发布于 2016-04-08 00:38:05
在您的uwsgi中使用lazy选项(--lazy)。
多进程的mongoengine发生死锁..:(
发布于 2021-06-18 15:51:51
https://github.com/MongoEngine/flask-mongoengine/blob/master/docs/index.rst
您可以使用设置connect=False,如下所示
app.config['MONGODB_SETTINGS'] = {
'host': 'mongodb://localhost/database_name',
'connect': False,
}
# or
app.config['MONGODB_CONNECT'] = Falsehttps://stackoverflow.com/questions/34369866
复制相似问题