pymongo: MongoClient opened before fork錯誤排解


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

[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)

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

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.

fork是啟動新進程的方法,並且由於PyMongo不是進程安全的,所以不應該將該實例從父進程中復制到子進程當中。在這個flask應用中,flask使用gunicorn作為網關接口,在啟動的時候會啟動一個主進程和多個子進程,也就是master/workers,這個時候就出現了MongoClient實例在進程之間的傳遞。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM