pymongo: MongoClient opened before fork錯誤排解

使用pymongo配合flask和gunicorn使用的時候觸發如下錯誤信息:html

[2017-09-19 15:20: ] [25780] [CRITICAL] WORKER TIMEOUT (pid:25896)
/home/for4c/projects/excel.d/venv3.4/lib/python3.4/site-packages/pymongo/topology.py:145: UserWarning: MongoClient opened before fork. Create MongoClient with connect=False, or create client after forking. See PyMongo's documentation for details: http://api.mongodb.org/python/current/faq.html#pymongo-fork-safe>
"MongoClient opened before fork. Create MongoClient "
[2017-09-19 15:20:10 +0800] [25896] [INFO] Worker exiting (pid: 25896)python

提示的意思是MongoClient在fork以前開啓了,官方文檔指出:mongodb

PyMongo is not fork-safe. Care must be taken when using instances of MongoClient with fork(). Specifically, instances of MongoClient must not be copied from a parent process to a child process.flask

fork是啓動新進程的方法,而且因爲PyMongo不是進程安全的,因此不該該將該實例從父進程中複製到子進程當中。在這個flask應用中,flask使用gunicorn做爲網關接口,在啓動的時候會啓動一個主進程和多個子進程,也就是master/workers,這個時候就出現了MongoClient實例在進程之間的傳遞。api

爲了解決這個問題,在實例化MongoClient對象的時候要加上connect=False參數。app.mongo = MongoClient(host='0.0.0.0',port=27017,connect=False)。安全

相關文章
相關標籤/搜索