使用气流时,我会收到“ 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'))

谢谢你, 迪娜

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...