当我启动某些服务时,它会报告此类警告并且服务停止:
/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。 有人可以给我一些建议吗?
干杯, 凯
如果您使用 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.
确保在分叉导致连接之前没有对客户端执行任何操作。
更好的是,在分叉之前根本不要创建客户端。分叉后在子流程中创建您的客户端。
我选择这样做:
import pymongo, os
from pymongo import MongoClient
_db = {}
# recupere la connexion
def getBdd():
global _db
if not os.getpid() in _db:
client = MongoClient( URI )
_db[ os.getpid() ] = client[ BDD ]
return _db[ os.getpid() ]
# recupere une collection
def getCol( sCol ):
return getBdd()[ sCol ]
通过创建按进程标识符划分的字典。