MongoClient在fork之前打开。创建MongoClient

时间:2017-09-27 07:30:16

标签: python mongodb pymongo gunicorn

当我开始提供某些服务时,会报告此类警告并停止服务:

/usr/lib64/python2.6/site-packages/pymongo/topology.py:75: 
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#using-pymongo-with-multiprocessing>
"MongoClient opened before fork. Create MongoClient "

但是,MongoClient一直使用参数connect=False,因为您可以查看以下代码:

client = MongoClient(host, port, connect=False)

它仍然无效。顺便说一句,我已将我的pymongo版本升级到3.4.0。 有人可以给我一些建议吗?

干杯, 启

2 个答案:

答案 0 :(得分:6)

如果使用 MongoClient进行任何与MongoDB服务器联系的操作,那么MongoClient必须创建连接和后台线程。一旦发生这种情况,在分叉子流程中使用它就不再安全了。例如,这是不安全的:

client = MongoClient(connect=False)
client.admin.command('ping')  # The client now connects.
if not os.fork():
    client.admin.command('ping')  # This will print the warning.

确保在导致连接的分支之前,您没有对客户端做任何事情。

更好的是,在完全分叉之前不要创建客户端。在fork之后,在子进程中创建客户端。

答案 1 :(得分:0)

我有同样的问题,但设置略有不同。对我而言,它是Flask应用,并且MongoClient是通过flask_mongoengine创建的。这是我的answare