python单例模式应用之pymongo连接

文章目录

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

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 Configclass 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@classmethoddef 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的URIuri = 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, dirnameimport 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 timefrom db.mongo_pool import MongoPooldef 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.mzph.cn/news/735799.shtml

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

相关文章

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体(subject)目标(object)策略(policy)(多个规则的集合)安全上下文(security context) 文…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

【个人开发】llama2部署实践(三)——python部署llama服务(基于GPU加速)

1.python环境准备 注:llama-cpp-python安装一定要带上前面的参数安装,如果仅用pip install装,启动服务时并没将模型加载到GPU里面。 # CMAKE_ARGS"-DLLAMA_METALon" FORCE_CMAKE1 pip install llama-cpp-python CMAKE_ARGS"…

【实验报告】C语言实现猜单词的小游戏

之前帮别人写的一个简单的报告,无偿分享给大家~代码在后面,有一些图片出于懒惰没有上传。比较简单,喜欢的话关注我~,请勿商用~ 1 系统功能模块结构图 该程序主要思路: 头文件设计,存储结构设计&#xff0…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址:[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址:https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

UE4开个头-简易小汽车

跟着谌嘉诚学的小Demo,记录一下 主要涉及到小白人上下车和镜头切换操作 1、动态演示效果 2、静态展示图片 3、蓝图-上下车

机器人大赛有什么用?

机器人大赛在多个方面都具有显著的价值。首先,机器人大赛可以为学生提供一个实践与创新的机会,有助于培养学生的动手实践能力和创新思维。在比赛过程中,学生需要运用所学的知识和技能,设计、制作和调试机器人,这不仅可…

基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行…

在 .NET 项目中复制资源文件夹到生成目录

本文主要介绍在使用 Visual Studio 进行调试和发布时,如何在 .NET 项目中复制资源文件夹到生成目录。 1. 背景 在开发 .NET 项目的过程中,我们有时会遇到需要在 debug 、 release 或是发布时将资源文件夹复制到生成目录的需求。这些资源可能包括图片、配…

Git分支管理(IDEA)

文章目录 Git分支管理(IDEA)1.Git分支管理(IDEA)1.基本介绍1.分支理解2.示意图 2.搭建分支和合并的环境1.创建Gitee仓库2.创建普通maven项目3.克隆Gitee项目到E:\GiteeRepository4.复制erp文件夹下的内容到IDEA项目下5.IDEA项目中…

基于微信小程序的校园跑腿小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Django 模版基本语法

Django学习笔记 模版语法 本质:在HTML中写一些占位符,由数据对这些占位符进行替换和处理。 views.py def page2(request):#定义一些变量将变量传送给templates中的html文件name1 sallyname2 yingyinghobbys [swimming,badminton,reading]person {…

03-安装配置jenkins

一、安装部署jenkins 1,上传软件包 为了方便学习,本次给大家准备了百度云盘的安装包 链接:https://pan.baidu.com/s/1_MKFVBdbdFaCsOTpU27f7g?pwdq3lx 提取码:q3lx [rootjenkins ~]# rz -E [rootjenkins ~]# yum -y localinst…

【C语言】linux内核ip_generic_getfrag函数

一、讲解 这个函数ip_generic_getfrag是传输层用于处理分段和校验和的一个辅助函数,它通常用在IP层当需要从用户空间拷贝数据构建成网络数据包时。这个函数的实现提供了拷贝数据和进行校验和计算(如果需要的话)的功能。函数的参数解释如下&a…

[Spark SQL]Spark SQL读取Kudu,写入Hive

SparkUnit Function:用于获取Spark Session package com.example.unitlimport org.apache.spark.sql.SparkSessionobject SparkUnit {def getLocal(appName: String): SparkSession {SparkSession.builder().appName(appName).master("local[*]").getO…

【C#图解教程】笔记

文章目录 1. C#和.NET框架.NET框架的组成.NET框架的特点CLRCLICLI的重要组成部分各种缩写 2. C#编程概括标识符命名规则: 多重标记和值格式化数字字符串对齐说明符格式字段标准数字格式说明符标准数字格式说明符 表 3. 类型、存储和变量数据成员和函数成员预定义类型…

三栏布局的实现方法

1. 什么是三栏布局 常见的一种页面布局方式,将页面分为左栏、中栏和右栏左右两侧的盒子宽度固定,中间的盒子会随屏幕自适应一般中间放主体内容,左右两边放辅助内容 2. 如何实现三栏布局 2.1 弹性布局 将最外层盒子设为弹性布局&#xff0…

爬虫入门到精通_框架篇16(Scrapy框架基本使用_名人名言的抓取

1 目标站点分析 抓取网站:http://quotes.toscrape.com/ 主要显示了一些名人名言,以及作者、标签等等信息: 点击next,page变为2: 2 流程框架 抓取第一页:请求第一页的URL并得到源代码,进行下…

基于鹦鹉优化算法(Parrot optimizer,PO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行…

《计算机网络》考研:2024/3/7 2.1.4 奈氏准则和香农定理

2024/3/7 (作者转行去干LLMs了,但是又想搞定考研,忙不过来了就全截图了呜呜呜。。。 生活真不容易。) 2.1.4 奈氏准则与香农定理