2015-12-19 59 views
1

當我在多進程模式下啓動uwsgi時,它表示應該使用connect = False運行pymongo。如果我運行flask-mongoengine,如何設置connect = False?用mongoengine運行uwsgi

回答

0

在你的uwsgi中使用懶惰選項(--lazy)。
mongoengine與多發生死鎖.. :(

3

那麼,作爲巨韓元李說,添加選項懶解決問題,但作爲uwsgi文檔中指出的強烈勸阻:

http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html

uWSGI儘可能地嘗試(ab)使用fork()調用的Copy On Write語義。默認情況下,它會在加載應用程序以儘可能多地共享內存之後進行分叉。如果這種行爲不受歡迎出於某種原因,請使用lazy-apps選項,這將指示uWSGI加載appl在每個工人的叉子()之後。當心因爲有一個名爲懶的方法更多侵入性和高度氣餒舊的選項(這是還在這裏只是爲了向後兼容)

所以,如果你想使用這個選項更好地利用--lazy-應用。據我所知,問題在於,默認情況下,mongoengine for flask只初始化一個分叉程序無法使用的連接(由於pymongo客戶端的一些限制)。什麼使懶惰應用程序的選項是加載每個叉的一切(使用更多的內存)。

有一個裝飾器可以讓你在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

您的示例代碼中的setup_db()上的裝飾器應該是@postfork而不是@prefork? –