python单例模式应用之pymongo连接

news2024/9/30 19:35:27

文章目录

    • 单例模式介绍
    • 模块简介
    • 安装
    • 简单的连接使用
    • 单例模式的连接
      • 单例类的实现
      • 配置的使用
      • 单例模式的测试
    • 单例连接的调用

https://gitee.com/allen-huang/python

单例模式介绍

适用场景:
单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:

  1. 需要频繁实例化然后销毁的对象。
  2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  3. 有状态的工具类对象。
  4. 频繁访问数据库或文件的对象。

以下都是单例模式的经典使用场景:

  1. 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。还有windows系统的回收站和任务管理器,只能打开一个。
  2. 控制资源的情况下,方便资源之间的互相通信。多线程的线程池的设计一般就是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

接下来就是以 pymongo模块的来举例说明

模块简介

pymongo 是 python 操作 mongodb 的官方库,它pymongo 提供了mongdb和python交互的所有方法,文档地址:https://www.mongodb.com/docs/drivers/pymongo/

安装

pip install pymongo

简单的连接使用

先使用常规的连接方式来创建 pymongo 的连接看下,下面展示的是一个测试用例代码,具体源码在 gitee 上
源码的具体链接:https://gitee.com/allen-huang/python/blob/master/python-code/do-mongodb/test_client.py

  • 方式1:
...
def test_client1(self):
    """
    简单连接1
    @return:
    """
    # 创建连接
    client = MongoClient(host="127.0.0.1", port=27017, username="admin", password="YrnKzEubSv6")

    # 选择一个库下面的集合,如果集合不存在,则自动新建
    coll = client['test']['user']
    print(coll.find_one({'uid': 1}))
    pass
...

在这里插入图片描述

  • 方式2:
...
def test_client2(self):
    """
    简单连接方式2:使用连接字符串
    @return:
    """
    # 创建连接
    uri = f"mongodb://admin:YrnKzEubSv6@127.0.0.1:27017/?maxPoolSize=20"
    client = MongoClient(uri, connectTimeoutMS=5000)

    # 选择一个库下面的集合,如果集合不存在,则自动新建
    coll = client['test']['user']
    print(coll.find_one({'uid': 1}))
    pass
...

在这里插入图片描述

单例模式的连接

这里创建单例模式,是基于__new__方法结合 pymongo的连接池来实现,pymongo 的连接池是内部已经集成了的,只要设置 maxPoolSize 参数就行。

单例类的实现

import threading
from pymongo import MongoClient
from conf.load_config import Config

class MongoPool(object):
    """
    mongodb连接池创建
    """
    _pool = None
    _instance = None
    _lock = threading.Lock()  # 线程锁,是属于同步锁

    def __new__(cls):
        if not cls._instance:  # 在并发进来的时候,只会创建一次,如果已经创建了,就不用排队再去等待上锁了再判断实例是否为空,这样子可以提高性能。
            with cls._lock:  # 类似JAVA的synchronized,自动获取和释放锁
                if not cls._instance:
                    cls._instance = cls.get_pool()
        return cls._instance

    @classmethod
    def get_pool(cls):
        """
        获取连接池实例
        """
        user = Config['mongodb']['user']
        host = Config['mongodb']['host']
        port = Config['mongodb']['port']
        password = Config['mongodb']['password']
        maxPoolSize = Config['mongodb']['maxPoolSize']
        connectTimeoutMS = Config['mongodb']['connectTimeoutMS']

        # 连接mongodb的URI
        uri = f"mongodb://{user}:{password}@{host}:{port}/?maxPoolSize={maxPoolSize}"
        client = MongoClient(uri, connectTimeoutMS=connectTimeoutMS)
        return client

配置的使用

  • 配置的格式:

是基于 yaml 来的,根据不同服务器环境变量来 自动匹配配置文件,pyYaml的使用参考这一篇文章。

安装:

pip install pyyaml
  • 环境变量来控制不同的配置

可以根据服务器各自的环境变量 来匹配(开发、测试、生产环境)的配置文件,这样子的好处就是各自的环境配置都不受到影响,提高的系统的稳定
我这边测试的是mac本地,在.zshrc文件中,环境变量共用了之前 chatgpt 项目设置好的环境变量 CHATGPT_PYTHON_ENV,在测试和生产环境的原理也一样,只需要改成CHATGPT_PYTHON_ENV="test"CHATGPT_PYTHON_ENV="prod"就行。

在这里插入图片描述

  • 配置加载代码

源码的链接地址:https://gitee.com/allen-huang/python/tree/master/conf/load_config.py

import os
from os.path import abspath, dirname

import yaml

# 获取各个环境对应的配置文件
CONFIG_FILES = {
    'dev': 'config-dev.yaml',
    'test': 'config-test.yaml',
    'prod': 'config-prod.yaml'
}

# 获取配置
Config = {}


def load_config():
    global Config

    # 获取当前运行环境
    env = os.getenv('CHATGPT_PYTHON_ENV', 'dev')
    if env not in CONFIG_FILES:
        raise ValueError('没有该环境的配置文件')

    with open(abspath(dirname(__file__)) + '/' + CONFIG_FILES[env], 'r', encoding='utf-8') as f:
        try:
            Config = yaml.safe_load(f)
        except yaml.YAMLError as e:
            raise e


# 读取当前项目的运行环境,如果没有则默认是dev环境
try:
    load_config()
except Exception as e:
    print(e)

单例模式的测试

开启10个线程测试, 这里不采用单元测试,而是采用__main__里面执行线程,因为单元测试使用多线程会有问题,线程执行不全。
源码地址:https://gitee.com/allen-huang/python/blob/master/python-code/do-mongodb/test_client_singleton.py

import threading
import time

from db.mongo_pool import MongoPool


def task(arg):
    mongo_obj = MongoPool()
    # 连接池对象是否是同一个地址
    str = f"执行编号:{arg}, 连接对象的内存地址: {id(mongo_obj)}"
    # 等待2秒
    time.sleep(2)
    print(str)


# 使用多线程进行测试
if __name__ == '__main__':
    thread_list = []
    for i in range(10):
        t = threading.Thread(target=task, args=(i,))
        thread_list.append(t)
        t.start()

    for t in thread_list:
        t.join()

在这里插入图片描述

单例连接的调用

下面是测试用例的代码,具体源码看链接https://gitee.com/allen-huang/python/blob/master/python-code/do-mongodb/test_client.py

...
def test_client3(self):
    """
    简单连接方式3:使用单例
    @return:
    """
    data = MongoPool().test.user.find_one({'uid': 1})
    print(data)
...

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页设计中通过css在一个固定宽度的div容器中让一行超出的文本隐藏并省略掉

实现效果: 实现的关键css: overflow:hidden;这个表示超出容器的内容进行隐藏 white-space:nowrap;表示文本不断行显示 text-overflow:ellipsis;表示超出的部分用省略号进行表示 …

定制repo(不再切换python和google源)

文章目录 定制repo(不再切换python和google源)前言各用各的repo定制repo2/repo3源码自动识别repo2/repo3项目完整解决方案: 定制repo(不再切换python和google源) 众知,Android/AOSP/ROM系统开发&#xff0c…

C语言-写一个简单的Web服务器(一)

基于TCP的web服务器 概述 C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。 关于网络的TCP协议在…

太长不看!公众号文章AI省流助手,从文章直接跳转总结!

大家好啊,我是豆小匠。 好久不见,最近在完善独立开发的小程序:豆流便签。 这期来分享新开发的一个功能:公众号文章直接跳转AI总结,并提供保存便签功能。 1. 前置条件 只支持解析公众号文章。只支持解析文字&#xf…

基于神经网络的偏微分方程求解器再度取得突破,北大字节的研究成果入选Nature子刊

目录 一.引言:神经网络与偏微分方程 二.如何基于神经网络求解偏微分方程 1.简要概述 2.基于神经网络求解偏微分方程的三大方向 2.1数据驱动 基于CNN 基于其他网络 2.2物理约束 PINN 基于 PINN 可测量标签数据 2.3物理驱动(纯物理约束) 全连接神经网路(FC-NN) CN…

STM32CubeMX学习笔记15---CAN总线

1、CAN简介 CAN总线网络的结构有闭环和开环两种形式 闭环结构的CAN总线网络,总线两端各连接一个1202的电阻。这种CAN总线网络由ISO11898标准定义,是高速、短距离的CAN网络,通信速率为125kbit/s到1Mbit/s。在1Mbit/s通信速率时&#x…

IOS使用Unity容器动态加载3D模型

项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。 对于Unity容器来说,需要满足如下的功能: 1.在APP启动时,需要满足动态下载最…

【开源】SpringBoot框架开发软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

OCP Java17 SE Developers 复习题09

答案 A, E. For the first scenario, the answer needs to implement List because the scenario allows duplicates, narrowing it down to options A and D. Option A is a better answer than option D because LinkedList is both a List and a Queue, and you just nee…

2024年【化工自动化控制仪表】新版试题及化工自动化控制仪表考试试题

题库来源:安全生产模拟考试一点通公众号小程序 化工自动化控制仪表新版试题是安全生产模拟考试一点通总题库中生成的一套化工自动化控制仪表考试试题,安全生产模拟考试一点通上化工自动化控制仪表作业手机同步练习。2024年【化工自动化控制仪表】新版试…

Go语言必知必会100问题-20 切片操作实战

前言 有很多gopher将切片的length和capacity混淆,没有彻底理清这两者的区别和联系。理清楚切片的长度和容量这两者的关系,有助于我们合理的对切片进行初始化、通过append追加元素以及进行复制等操作。如果没有深入理解它们,缺少高效操作切片…

如何查看centos7中启动了几个nginx

在 CentOS 7 中,最常用的几种方法如下: 1. 使用 ps 命令 ps 命令可以用来显示当前系统中正在运行的进程。要查看所有 Nginx 进程,可以使用以下命令: ps -ef | grep nginx这个命令会列出所有包含“nginx”字符串的进程。输出中会…

SDM450核心板_高通SDM450安卓核心板模块性能参数

高通SDM450核心板是基于SDM450移动平台开发的一款高性能核心板。采用领先的14纳米技术,该核心板为高端智能设备提供了卓越的性能和优质的体验。板载2GB16GB的内存(可选配4GB32GB),双 ISP(图像传感器处理器)支持丰富的照片细节和双摄像头体验,…

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式,也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中,一个对象(称作Subject)维护着一个对象列表,这些对象(称作Observers)都…

每日学习笔记:C++ STL 的Array

Array定义 Array模板有两个参数,一个是元素类型,一个是数组大小 Array初始化 Array的操作 Array当作C数组 Array的Tuple接口

NLP:文本相似度计算

前面我们已经实现了把长段的句子,利用HanLP拆分成足够精炼的分词,后面我们要实现“联想”功能,我这里初步只能想到通过文本相似度计算来实现。下面介绍一下文本相似度计算 (当然HanLP也有文本相似度计算的方法,这里我…

Day33-计算机基础3

Day33-计算机基础3 1.根据TCP/IP进行Linux内核参数优化1.1 例1:调整访问服务端的【客户端】的动态端口范围 ,LVS(10-50万并发),NGINX负载,SQUID缓存服务,1.2 企业案例:DOS攻击的案例&#xff1a…

第五十三天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

Leetcode 1143.最长公共子序列 题目链接:1143 最长公共子序列 题干:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&…

no main manifest attribute,in xxx.jar(关于Spring项目,无法在云服务器上运行jar包的解决方法)

目录 问题详情 解决方法 问题详情 项目可以打包正常&#xff0c;但是云服务器上无法运行&#xff0c;报错&#xff1a;no main manifest attribute&#xff0c;in xxx.jar 解决方法 1.查看pom.xml配置文件&#xff0c;检查以下代码&#xff0c;没有则加上&#xff1a; <…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…