MongoClient和AsyncIOMotorClient的区别和用法

示例代码:

from motor.motor_asyncio import AsyncIOMotorClient
from pymongo import MongoClient

🔍 这两个库分别是:

名字说明举个例子
pymongo.MongoClient同步版 的 MongoDB 客户端(常规阻塞式操作)你在主线程里一行一行地读写 Mongo,等上一步做完才能做下一步
motor.motor_asyncio.AsyncIOMotorClient异步版 的 MongoDB 客户端(非阻塞协程)你可以用 await,并发跑多个 Mongo 操作,适合高并发 Web 应用

✅ 区别

1. pymongo.MongoClient(同步)

  • 每一次数据库操作都会阻塞代码执行,等 MongoDB 返回结果之后,程序才继续往下走。
  • 适合脚本、命令行工具、Jupyter、低并发后端服务。

比喻:
像是你去银行排队,一个人办完业务,下一个人才能开始。


2. motor.AsyncIOMotorClient(异步)

  • 每次数据库操作是异步非阻塞的,你可以 await 数据返回,但其他任务可以同时干活。
  • 适合 FastAPI、aiohttp 这类异步 Web 框架,可以显著提升并发性能。

比喻:
像是网上办业务,你递交申请后不用等结果,先去干别的,等通知你再回来取。


🔢 举个数值对比的例子:

假设你要对 MongoDB 读取 1000 个用户文档。

使用 pymongo.MongoClient(同步):

from pymongo import MongoClientclient = MongoClient()
db = client["mydb"]
users = db["users"]for i in range(1000):doc = users.find_one({"_id": i})  # 每次都等待数据库返回

⏱️ 假设每次请求花费 10ms,总耗时大约:

1000 次 × 10ms = 10,000ms ≈ 10秒

使用 motor.AsyncIOMotorClient(异步 + 并发):

from motor.motor_asyncio import AsyncIOMotorClient
import asyncioclient = AsyncIOMotorClient()
db = client["mydb"]
users = db["users"]async def get_user(i):return await users.find_one({"_id": i})results = await asyncio.gather(*[get_user(i) for i in range(1000)])  # 并发执行

💡 因为是并发的,可以同时发出多个请求,假设最多100个并发连接:

1000 次 ÷ 100 并发批次 × 10ms ≈ 100ms

总时间只需要 ~0.1 秒,而不是 10 秒!性能提升 100 倍!


✅ 总结对比表

特性pymongo.MongoClient(同步)motor.AsyncIOMotorClient(异步)
编程模式同步,阻塞异步,非阻塞(await
适用场景脚本、数据分析、低并发后端FastAPI、aiohttp 等高并发后端
并发性能差,串行执行高,可并发处理成百上千请求
代码复杂度稍高(需要 async def + await
官方推荐适合非异步项目适合异步框架

🔧 技术选型建议:

如果你是用…推荐使用
Flask、Djangopymongo.MongoClient
FastAPI、aiohttp、Sanicmotor.AsyncIOMotorClient

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

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

相关文章

5.15打卡

浙大疏锦行 DAY 26 函数专题1 知识点回顾: 1. 函数的定义 2. 变量作用域:局部变量和全局变量 3. 函数的参数类型:位置参数、默认参数、不定参数 4. 传递参数的手段:关键词参数 5. 传递参数的顺序:同时出现三种参数…

针对面试-mysql篇

1.如何定位慢查询? 1.1.介绍一下当时产生问题的场景(我们当时的接口测试的时候非常的慢,压测的结果大概5秒钟)),可以监测出哪个接口,最终因为是sql的问题 1.2.我们系统中当时采用了运维工具(Skywalking就是2秒,一旦sql执行超过2秒…

window 显示驱动开发-报告图形内存(三)

图形内存报告示例 示例 1:笔记本电脑上的 128 MB 专用板载图形内存 以下屏幕截图显示了使用 Intel Iris 离散图形适配器运行 Windows 11 的 Surface 笔记本电脑的计算图形内存数。 适配器的可用内存总数为 16424 MB,用于图形用途,细分如下&…

极简主义现代商务风格PPT模版6套一组分享下载

现代商务风格PPT模版下载https://pan.quark.cn/s/12fbc52124d9 第一张PPT模版,简约风,橄榄绿背景,黑色竖条装饰,文字有中英文标题和占位符。需要提取关键元素:简约、橄榄绿、对称布局、占位文本的位置。 风格​&#…

SpringBoot中10种动态修改配置的方法

在SpringBoot应用中,配置信息通常通过application.properties或application.yml文件静态定义,应用启动后这些配置就固定下来了。 但我们常常需要在不重启应用的情况下动态修改配置,以实现灰度发布、A/B测试、动态调整线程池参数、切换功能开…

嵌入式自学第二十二天(5.15)

顺序表和链表 优缺点 存储方式: 顺序表是一段连续的存储单元 链表是逻辑结构连续物理结构(在内存中的表现形式)不连续 时间性能, 查找顺序表O(1):下标直接查找 链表 O(n):从头指针往后遍历才能找到 插入和…

高并发内存池(三):TLS无锁访问以及Central Cache结构设计

目录 前言: 一,thread cache线程局部存储的实现 问题引入 概念说明 基本使用 thread cache TLS的实现 二,Central Cache整体的结构框架 大致结构 span结构 span结构的实现 三,Central Cache大致结构的实现 单例模式 thr…

Ubuntu 安装 Docker(镜像加速)完整教程

Docker 是一款开源的应用容器引擎,允许开发者打包应用及其依赖包到一个轻量级、可移植的容器中。本文将介绍在 Ubuntu 系统上安装 Docker 的步骤。 1. 更新软件源 首先,更新 Ubuntu 系统的软件源: sudo apt update2. 安装基本软件 接下来…

【深度学习】数据集的划分比例到底是选择811还是712?

1 引入 在机器学习中,将数据集划分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)是非常标准的步骤。这三个集合各有其用途: 训练集 (Training Set)&#xff…

Mysql刷题 day01

LC 197 上升的温度 需求:编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id 。 代码: select w2.id from Weather as w1 join Weather as w2 on DateDiff(w2.recordDate , w1.recordDate) 1 where…

鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp

UniApp 制作个人信息编辑界面与头像上传功能 前言 最近在做一个社交类小程序时,遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单,但要做好用户体验和兼容多端,还是有不少细节需要处理。经过一番摸索,总结出了一套…

科技的成就(六十八)

623、杰文斯悖论 杰文斯悖论是1865年经济学家威廉斯坦利杰文斯提出的一悖论:当技术进步提高了效率,资源消耗不仅没有减少,反而激增。例如,瓦特改良的蒸汽机让煤炭燃烧更加高效,但结果却是煤炭需求飙升。 624、代码混…

荣耀手机,系统MagicOS 9.0 USB配置没有音频来源后无法被adb检测到,无法真机调试的解决办法

荣耀手机,系统MagicOS 9.0 USB配置没有音频来源后无法被adb检测到,无法真机调试的解决办法 前言环境说明操作方法 前言 一直在使用的uni-app真机运行荣耀手机方法,都是通过设置USB配置的音频来源才能成功。突然,因为我的手机的系…

D-Pointer(Pimpl)设计模式(指向实现的指针)

Qt 的 D-Pointer(Pimpl)设计模式 1. Pimpl 模式简介 Pimpl(Pointer to Implementation)是一种设计模式,用于将类的接口与实现分离,从而隐藏实现细节,降低编译依赖,提高代码的可维护…

MySQL 8.0 OCP 1Z0-908 101-110题

Q101.which two queries are examples of successful SQL injection attacks? A.SELECT id, name FROM backup_before WHERE name‘; DROP TABLE injection; --’; B. SELECT id, name FROM user WHERE id23 oR id32 OR 11; C. SELECT id, name FROM user WHERE user.id (SEL…

Vue ElementUI原生upload修改字体大小和区域宽度

Vue ElementUI原生upload修改字体大小和区域宽度 修改后 代码 新增的修改样式代码 .upload-demo /deep/ .el-upload-dragger{width: 700px;height: 300px; }原有拖拽组件代码 <!-- 拖拽上传组件 --><el-uploadclass"upload-demo"dragaction"":m…

React和Vue在前端开发中, 通常选择哪一个

React和Vue的选择需结合具体需求&#xff1a; 选React的场景 大型企业级应用&#xff0c;需处理复杂状态&#xff08;如电商、社交平台&#xff09;团队熟悉JavaScript&#xff0c;已有React技术栈积累需要高度灵活的架构&#xff08;React仅专注视图层&#xff0c;可自由搭配…

Python爬虫实战:研究源码还原技术,实现逆向解密

1. 引言 在网络爬虫技术实际应用中,目标网站常采用各种加密手段保护数据传输和业务逻辑。传统逆向解密方法依赖人工分析和调试,效率低下且易出错。随着 Web 应用复杂度提升,特别是 JavaScript 混淆技术广泛应用,传统方法面临更大挑战。 本文提出基于源码还原的逆向解密方法…

什么是alpaca 或 sharegpt 格式的数据集?

环境&#xff1a; LLaMA-Factory 问题描述&#xff1a; alpaca 或 sharegpt 格式的数据集&#xff1f; 解决方案&#xff1a; “Alpaca”和“ShareGPT”格式的数据集&#xff0c;是近年来在开源大语言模型微调和对话数据构建领域比较流行的两种格式。它们主要用于训练和微调…

OpenCV CUDA模块中矩阵操作------矩阵元素求和

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV的CUDA模块中&#xff0c;矩阵元素求和类函数主要用于计算矩阵元素的总和、绝对值之和以及平方和。这些操作对于图像处理中的特征提取、…