mongodb MongoClient在fork之前打开,创建MongoClient

vfh0ocws  于 2023-11-17  发布在  Go
关注(0)|答案(3)|浏览(173)

当我启动一些服务时,它会报告这样的警告,服务会停止:

/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了,有没有人给予点建议?
干杯凯

oalqel3c

oalqel3c1#

如果你使用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之前,您没有对客户端执行任何操作。
更好的是,在fork之前根本不要创建客户端。在fork之后,在子流程中创建客户端。

jw5wzhpr

jw5wzhpr2#

我遇到了同样的问题,但设置略有不同。对我来说,它是Flask应用程序,MongoClient是通过flask_mongoengine创建的。这是我的答案

lp0sw83n

lp0sw83n3#

我选择这样做:

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 ]

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

相关问题