【问题标题】:MongoClient opened before fork. Create MongoClientMongoClient 在 fork 之前打开。创建 MongoClient
【发布时间】:2018-03-08 14:09:50
【问题描述】:

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

/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


    【解决方案1】:

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

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

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

    【讨论】:

    • 代码在我重新启动所有服务之前工作。这很奇怪。
    • @KOPLee - 这里也一样。我认为这与在 python 中引入适当的异步以及它导致的一系列问题之后的竞争条件有关。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 2018-12-10
      • 2021-03-23
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2014-05-04
      • 2016-05-10
      相关资源
      最近更新 更多