MongoClient 在 fork 之前打开。创建 MongoClient

问题描述 投票:0回答:3

当我启动某些服务时,它会报告此类警告并且服务停止:

/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。 有人可以给我一些建议吗?

干杯, 凯

python mongodb pymongo gunicorn
3个回答
19
投票

如果您使用 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.

确保在分叉导致连接之前没有对客户端执行任何操作。

更好的是,在分叉之前根本不要创建客户端。分叉后在子流程中创建您的客户端。


1
投票

我遇到了同样的问题,但设置略有不同。对我来说,它是 Flask 应用程序,而

MongoClient
是通过
flask_mongoengine
创建的。这是我的答案


0
投票

我选择这样做:

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 ]

通过创建按进程标识符划分的字典。

© www.soinside.com 2019 - 2024. All rights reserved.