微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用气流时,我会收到“ UserWarning:MongoClient在派生前打开” +最佳实践提示,以python实例化mongo客户端

我创建了一个执行各种步骤的python流。我还使用了MongoDB,它目前用于配置目的,但会进一步用于持久性。 当我从Pycharm执行我的代码时,一切都很好,但是当我通过Airflow执行代码时,我收到了分叉警告“ UserWarning:MongoClient在分叉之前打开。仅在分叉之后创建MongoClient。”

起初我以为问题是我打开了许多Mongo客户端实例,所以我使用了单例模式,因此连接仅被实例化一次(请参阅下面的代码)。 摆脱警告的唯一方法添加connect = False参数,就像您在我的代码中看到的那样,但这似乎是一种解决方法,而不是一个稳定的解决方案-根据文档-。

那么这里是什么问题?可能与气流有关-因为我没有使用mongo_hook-? 另外,请告诉我,一旦Mongo Client是一个好习惯,是否使用单例模式进行实例化?从各个模块调用客户端。

请注意,Mongo和Airflow在单独的docker中运行。

def singleton(class_): 实例= {}

def get_instance(*args,**kwargs):
    if class_ not in instances:
        instances[class_] = class_(*args,**kwargs)
    return instances[class_]

return get_instance

@singleton MongoPersistence(Persistence)类:

def __init__(self,driver,host,user,password,port,db):
    self._uri = '{driver}://{host}:{port}'.format(driver=driver,host=host,port=port)        
    self._client = MongoClient(self._uri,serverSelectionTimeoutMS=3000  # 3 second timeout,username=self.user,password=self.password
                         #,connect=False
                               )

    def find_one(self,**kwargs):
    return self._client[kwargs.get('db_name')][kwargs.get('collection_name')].find_one(kwargs.get('query'))

谢谢你, 迪娜

原文地址:https://www.jb51.cc/python/3191799.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐