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

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

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

  1. /usr/lib64/python2.6/site-packages/pymongo/topology.py:75:
  2. UserWarning: MongoClient opened before fork. Create MongoClient with connect=False,
  3. or create client after forking. See PyMongo's documentation for details:
  4. http://api.mongodb.org/python/current/faq.html#using-pymongo-with-multiprocessing>
  5. "MongoClient opened before fork. Create MongoClient "

字符串
但是,MongoClient一直使用参数connect=False,您可以查看下面的代码:

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


还是不行,顺便说一句,我已经把我的pymongo版本升级到3. 4. 0了,有没有人给予点建议?
干杯凯

oalqel3c

oalqel3c1#

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

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

字符串
确保在导致客户端连接的fork之前,您没有对客户端执行任何操作。
更好的是,在fork之前根本不要创建客户端。在fork之后,在子流程中创建客户端。

jw5wzhpr

jw5wzhpr2#

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

lp0sw83n

lp0sw83n3#

我选择这样做:

  1. import pymongo, os
  2. from pymongo import MongoClient
  3. _db = {}
  4. # recupere la connexion
  5. def getBdd():
  6. global _db
  7. if not os.getpid() in _db:
  8. client = MongoClient( URI )
  9. _db[ os.getpid() ] = client[ BDD ]
  10. return _db[ os.getpid() ]
  11. # recupere une collection
  12. def getCol( sCol ):
  13. return getBdd()[ sCol ]

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

展开查看全部

相关问题