当前位置: 首页 > news >正文

做网站什么分类流量多动漫设计与制作学校

做网站什么分类流量多,动漫设计与制作学校,wordpress 默认评论,企业网站可以备案个人前言 MongoDB作为当今最流行的NoSQL数据库之一,以其灵活的数据模型和强大的扩展能力赢得了开发者的青睐。本文深入探讨如何使用Python异步操作MongoDB,特别是GridFS文件存储系统的实战应用。我们将从基础连接池管理到高级文件操作,全面解析现…

前言

MongoDB作为当今最流行的NoSQL数据库之一,以其灵活的数据模型和强大的扩展能力赢得了开发者的青睐。本文深入探讨如何使用Python异步操作MongoDB,特别是GridFS文件存储系统的实战应用。我们将从基础连接池管理到高级文件操作,全面解析现代Python应用与MongoDB的深度整合。

连接管理与单例模式实现

在构建与MongoDB交互的应用时,连接管理是首要考虑的问题,通过单例模式确保整个应用中只有一个MongoDB客户端实例。

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MongodbClient:def __init__(self):self.client = Noneself.db = Noneself.fs = Noneasync def connect(self):try:self.client = AsyncIOMotorClient(f"mongodb://{Config.mongodb_username}:{Config.mongodb_password}@{Config.mongodb_host}:{Config.mongodb_port}/",maxPoolSize=100,  # 最大连接数minPoolSize=10,   # 最小保持连接数connectTimeoutMS=30000,  # 连接超时(毫秒)socketTimeoutMS=30000,   # 操作超时(毫秒))self.db = self.client["ems_deploy_db"]self.fs = AsyncIOMotorGridFSBucket(self.db)log.info("MongoDB connected successfully")

这段代码有几个值得注意的高级特性

  1. 连接池配置:通过maxPoolSize和minPoolSize参数优化了连接池管理,这在Web应用等高并发场景中尤为重要
  2. 超时设置:明确的connectTimeoutMS和socketTimeoutMS避免了无限制等待
  3. 认证集成:从配置中安全地获取认证信息,而非硬编码在代码中

Motor是MongoDB官方推荐的异步Python驱动,它基于asyncio,能够无缝集成到现代Python异步生态中。与传统的同步驱动相比,Motor在高并发场景下能显著提升性能,特别是在I/O密集型操作中。

GridFS文件操作实战

MongoDB的GridFS是一个用于存储和检索大文件的文件系统,它突破了BSON文档16MB的大小限制,将大文件分割成多个小块(chunk)存储。

文件上传策略

下面是两种文件上传方法,涵盖了常见的使用场景:

  1. 文件夹压缩上传

    async def store_folder_to_gridfs(self, folder_path: str, filename: str) -> str:with tempfile.TemporaryDirectory() as temp_dir:zip_name = f"{filename}_{int(datetime.now().timestamp())}.zip"temp_zip = os.path.join(temp_dir, zip_name)await self._async_zip_folder(folder_path, temp_zip)async with aiofiles.open(temp_zip, "rb") as f:file_id = await self.fs.upload_from_stream(zip_name,await f.read(),metadata={"original_path": folder_path},)
    

    这种方法的特点包括:

    • 使用临时目录确保线程安全
    • 时间戳保证文件名唯一性
    • 元数据保存原始路径信息
    • 自动清理临时文件
  2. 直接内容上传

    async def store_file_content_to_gridfs(self, file_content: bytes, filename: str) -> str:file_id = await self.fs.upload_from_stream(filename, file_content,metadata={"original_filename": filename})
    

    这种方法适合已经将文件内容读入内存的场景,更加直接高效。

文件下载实现

文件下载同样考虑了性能和内存效率:

async def get_program_files_from_gridfs(self, mongo_id: str, filename: str) -> bytes:file_content = bytearray()grid_out = await self.fs.open_download_stream(ObjectId(mongo_id))while chunk := await grid_out.readchunk():file_content.extend(chunk)return bytes(file_content)
  • 使用bytearray动态扩展,避免了一次性分配大块内存
  • 流式读取,适合大文件下载

文件删除与重试机制

删除操作实现了健壮的重试机制,这在分布式系统中尤为重要:

async def delete_file_from_gridfs(self, mongoid: str, max_retries: int = 3) -> None:retries = 0while retries < max_retries:try:if self.client is None or not self.client.is_primary:await self.connect()await self.fs.delete(ObjectId(mongoid))returnexcept Exception as e:retries += 1if retries < max_retries:await asyncio.sleep(1)else:raise
  1. 连接状态检查
  2. 指数退避重试(示例中是固定间隔)
  3. 最大重试次数限制
  4. 连接异常时的自动重连

异步编程实践:

  1. 异步文件操作

    async def _async_zip_folder(self, folder_path: str, output_zip: str) -> None:proc = await asyncio.create_subprocess_exec("zip", "-r", output_zip, folder_path,stdout=asyncio.subprocess.PIPE,stderr=asyncio.subprocess.PIPE,)await proc.wait()
    
  2. 线程池执行同步操作

    async def cleanup_temp_dir(self, temp_dir: str) -> None:await asyncio.to_thread(shutil.rmtree, temp_dir, ignore_errors=True)
    
  3. 异步文件IO

    async with aiofiles.open(temp_zip, "rb") as f:await f.read()
    

    对于无法异步化的操作(如shutil.rmtree),使用asyncio.to_thread将其委托给线程池,保持主线程非阻塞

    使用aiofiles替代普通文件操作,实现真正的异步文件IO

http://www.dtcms.com/a/618781.html

相关文章:

  • Vue 项目实战《尚医通》,预约挂号就诊人组件搭建上,笔记40
  • 网站报价方案 模板医疗网站专题怎样做
  • 南京营销型网站商业网站的相关内容
  • 做实验教学视频的网站亚马逊关键词搜索器
  • 差异功能定位解析:C语言与C++(区别在哪里?)
  • 【c++中间件】spdlog日志介绍 二次封装
  • 设计网站中如何设置特效wordpress自定义短码
  • 4.FPGA字符格式
  • 网站服务器有问题怎么办啊南宁手机建站公司
  • 【Java 基础】4 面向对象 - 封装:面向对象三大特征之一
  • vps建设网站需要条件瀑布流资源网站模板
  • 还有做网站的必要吗识图 WordPress
  • 俄语 俄文 俄罗斯语外贸网站建设礼品定制
  • 郑州好的建网站公司wordpress 采集器
  • 轻松设置-系统优化万能工具
  • query加强之深度解析ReDI:通过分解与解释增强query理解的推理方法
  • 观点动力学和回音室
  • 中小学网站建设域名论坛网站
  • 5.网络原理之TCP_IP
  • 全球访问量top100网站建设银行官方网站-云服务
  • 小梦音乐下载 1.0.5 | 提供三条音源,支持多种音质选择和批量下载的音乐下载工具
  • GIS:揭开你神秘的面纱
  • 怎么做网站小图标有的网站域名解析错误
  • 安徽省网站肥建设网站湖北望新建设有限公司网站
  • 机器学习周报二十二
  • 计算二叉树的深度 | C语言
  • 什么网站算是h5做的网络推广企划
  • 传导案例:某医疗仪器传导骚扰整改案例
  • 做跨境电商有没推荐的网站新闻稿件代发平台
  • C++篇(18)类型转换与IO库