使用同步和异步方式更新插入MongoDB数据的性能对比

在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongomotor 库分别实现同步和异步的数据插入,并进行测试和分析。

项目结构

  1. MongoDB 连接设置:设置MongoDB的连接参数。
  2. 数据生成:生成用于测试的数据。
  3. 同步数据插入:使用 pymongo 库实现同步的数据插入。
  4. 异步数据插入:使用 motor 库实现异步的数据插入。
  5. 性能测试:对同步和异步插入的性能进行测试和比较。

代码实现

首先,我们定义MongoDB的连接设置和生成测试数据的函数:

import time
import pymongo
import motor.motor_asyncio
import asyncio
import random# MongoDB 连接设置
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'test_db'
MONGODB_COLLECTION1 = 'test_collection1'
MONGODB_COLLECTION2 = 'test_collection2'# 生成测试数据
def generate_test_data(num_records):return [{'asin': f'ASIN_{i}', 'data': random.random()} for i in range(num_records)]

同步插入数据的函数

我们使用 pymongo 库实现同步的数据插入:

# 同步插入数据的函数
def insert_data_sync(data):client = pymongo.MongoClient(MONGODB_HOST, MONGODB_PORT)db = client[MONGODB_DB]collection1 = db[MONGODB_COLLECTION1]start_time = time.time()for record in data:collection1.update_one({'asin': record['asin']}, {'$set': record}, upsert=True)end_time = time.time()client.close()return end_time - start_time

异步插入数据的函数

我们使用 motor 库实现异步的数据插入:

# 异步插入数据的函数
async def insert_data_async(data):client = motor.motor_asyncio.AsyncIOMotorClient(MONGODB_HOST, MONGODB_PORT)db = client[MONGODB_DB]collection2 = db[MONGODB_COLLECTION2]start_time = time.time()async def insert(record):await collection2.update_one({'asin': record['asin']}, {'$set': record}, upsert=True)await asyncio.gather(*[insert(record) for record in data])end_time = time.time()client.close()return end_time - start_time

主函数来运行测试

我们定义主函数生成测试数据,并分别测试同步和异步插入数据的性能:

# 主函数来运行测试
def main():data = generate_test_data(1000)  # 生成测试数据# 测试同步插入sync_time = insert_data_sync(data)print(f'Synchronous insertion time: {sync_time:.2f} seconds')# 测试异步插入loop = asyncio.get_event_loop()async_time = loop.run_until_complete(insert_data_async(data))print(f'Asynchronous insertion time: {async_time:.2f} seconds')if __name__ == '__main__':main()

代码分析与性能对比

1. 同步插入

  • 使用 pymongo 库进行同步插入,每次插入操作会等待前一个操作完成。
  • insert_data_sync 函数中,通过 update_one 方法插入或更新数据。

2. 异步插入

  • 使用 motor 库进行异步插入,可以并发处理多个插入操作。
  • insert_data_async 函数中,通过 asyncio.gather 并发执行多个插入任务。

性能测试结果

通过运行上述代码,我们得到以下性能测试结果:

Synchronous insertion time: 27.93 seconds
Asynchronous insertion time: 6.84 seconds

总结

从性能测试结果可以看出,异步插入数据的速度明显快于同步插入。这是因为异步操作可以同时处理多个请求,而同步操作需要等待前一个请求完成后再进行下一个请求。

同步插入的优点和缺点:
  • 优点:实现简单,调试方便。
  • 缺点:在处理大量数据时效率较低,容易造成阻塞。
异步插入的优点和缺点:
  • 优点:能够并发处理多个请求,提高处理效率。
  • 缺点:实现较为复杂,需要理解异步编程模型。

在实际应用中,如果需要处理大量数据并且对性能要求较高,建议使用异步方式进行数据插入。如果数据量较小或者实现复杂度较高,可以考虑使用同步方式。

以上内容,希望能帮助大家理解同步和异步插入MongoDB数据的实现方式及其性能对比。在实际开发中,可以根据具体需求选择合适的实现方式。

作者:pycode
链接:https://juejin.cn/post/7379169372395896872

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

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

相关文章

清华停招土木,新增地球科学引热议

早在今年2月26日,多个自媒体平台上有人发布消息称“清华大学停止土木工程等专业招生”,引发广泛关注。 在清华大学的官网可以看到下图的公告。 可以看到,清华大学停招土木工程等专业,新增地球系统科学等专业。这一举措引起全网热…

所有报表情况查询明细

Select a.Id, b.组Id, a.编号, a.名称, a.说明, a.程序id, a.修改时间, a.发布时间, a.系统, a.最后执行时间, Decode(Nvl(A.票据, 0), 1, 票据, 报表) 种类, Decode(Nvl(A.系统, 0), 0, 自制, 系统) 类型, a.执行人员 最后执行人, zlSpellCode(a.名称) 简码, d.…

OpenCV之cv::createTrackbar

在 OpenCV 中,cv::createTrackbar 是一个用于创建滑动条的函数,通常用于图像处理中的交互式参数调节。它允许用户通过滑动条来动态调整某个参数的值,从而实时观察其对图像处理结果的影响。 使用方法 包含头文件: 首先&#xff0c…

中文分词:Python、Golang、Java

常见的中文分词库 开源库语言说明jiebaPython最好的 Python 中文分词组件HanLPPython一系列模型与算法组成的NLP工具包FoolNLTKPython可能是最准的开源中文分词JcsegJava轻量级 Java 中文分词器AnsjJava基于 n-GramCRFHMM 的中文分词的 Java 实现wordJavaJava 分布式中文分词组…

亚马逊测评沃尔玛下单砍单率、死号率高是什么原因?

很多卖家和服务商在进行自养号测评补单过程中会出现砍单率、封号率高的问题,其实造成这种的原因很多,一套稳定的测评系统并不是单解决IP的纯净度问题或者支付卡的卡头风控问题就可以解决的,亚马逊测评下单砍单率、死号率高的原因可以归纳为以…

Vue50-mixin混入

一、为什么要使用 mixin混入 两个组件共享一个配置。 二、使用 mixin混入 2-1、创建一个混合js文件 2-2、引入混合js文件 1、局部混合 在每个组件中都引入混合js文件 注意: 混合就是复用配置,vm实例中的所有的配置项,都能在混合.js文件中写…

elasticsearch过滤器filter:原理及使用

码到三十五 : 个人主页 目录 一、引言二、Elasticsearch的过滤器概述三、使用DSL进行过滤操作术语过滤范围过滤复合过滤 四、优化策略五、结语 一、引言 Elasticsearch是一个功能强大的开源搜索引擎,广泛应用于各种数据检索和处理场景。在Elasticsearch…

WPS如何合并多个word文档到一个文档中

将多个Word文档合并成一个 【插入】---》【附件】----》【文件中的文字】----》选择多个需要合并的word文档,点击确定即可。 用的工具是WPS。

高级优化理论与方法(十五)

高级优化理论与方法(十五) Algorithms for Constrained OptimizationProjectionIdeaExampleMethodProblemSolutionOrthogonal ProjectorDefinitionRemarkLemmaTheorem ProjectionProjected steepest descentPropertiesTheoremProperties Lagranges Algor…

Qt插件系统

概述 Qt提供了两个用于创建插件的api: 一个高级API,用于编写Qt本身的扩展:自定义数据库驱动程序,图像格式,文本编解码器,自定义样式等。用于扩展Qt应用程序的低级API。 例如,如果您想编写一个自定义的QStyle子类并让…

MS1112驱动开发(iio框架)

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

Qt实现单例模式:Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS

目录 1.引言 2.了解Q_GLOBAL_STATIC 3.了解Q_GLOBAL_STATIC_WITH_ARGS 4.实现原理 4.1.对象的创建 4.2.QGlobalStatic 4.3.宏定义实现 4.4.注意事项 5.总结 1.引言 设计模式之单例模式-CSDN博客 所谓的全局静态对象,大多是在单例类中所见,在之前…

工具链 之 Vite 开发服务器所有选项解析(三)

server 配置 // vite.config.js import { defineConfig } from vite // https://vitejs.dev/config/ export default defineConfig({ server: { origin: http://127.0.0.1:8080, //用于定义开发调试阶段生成资源的 originhost: 0.0.0.0, // 监听所有可用的网络接口 po…

idea插件开发之在项目右键添加菜单

写在前面 本文看下如何在右键列表中增加菜单。 正戏 首先创建一个Action,要显示的menu选择ProjectViewPopupMenu,如下: action public class CAction extends AnAction {Overridepublic void actionPerformed(AnActionEvent e) { // …

MATLAB算法实战应用案例精讲-【数模应用】偏相关分析(附MATLAB、python和R语言代码实现)

目录 前言 知识储备 相关性分析 一、实际应用 二、理论思想 三、操作过程 四、结果分析 算法原理 什么是偏相关 数学模型 (一) 偏相关系数r (二) 假设检验 偏相关分析过程 偏相关分析的SPSS实现 SPSS、EXCLE实现偏相关分析 STATA SPSSPRO 1、作用 2、输入输…

C#语言入门详解 --- 方法(含传值 输出 引用 数组)

方法 方法标准式 <Access Specifier> <Return Type> <Method Name>(Parameter List) { Method Body } 让我们逐一对每一个模块进行解释&#xff1a; Access Specifier&#xff1a;访问修饰符&#xff0c;这决定了接下来的主题的可见性&#xff0c;包含p…

使用python绘制三维直方图

使用python绘制三维直方图 三维直方图定义特点 效果代码 三维直方图 维直方图&#xff08;3D直方图&#xff09;是一种用于展示三维数据分布情况的图表。它扩展了二维直方图的概念&#xff0c;通过在三维空间中绘制柱体来表示数据在三个维度&#xff08;X、Y、Z&#xff09;上…

漏斗限流(leaky bucket)

漏斗限流(leaky bucket&#xff09; 介绍工作原理leaky bucket实现示例&#xff1a;搭配pool池pool.lua示例搭配示例 对象池&#xff08;pool&#xff09;结合漏斗限流&#xff08;leaky bucket&#xff09;的好处&#xff1a; 介绍 漏斗限流&#xff08;leaky bucket&#xff…

Ollama 配置多并发和多模型

ollama新版已经支持了并发和多模型同时运行了&#xff0c; 系统资源够的可以走起了 默认的ollama服务是不支持的&#xff0c; 需要自己进行调整&#xff0c; 调整的方式如下&#xff1a; Linux为例 通过调用 编辑 systemd 服务systemctleditollama.service 这将打开一个编辑器…

Changes Coming to NIAP Entropy Assessment Reports in 2025

“What do you say to a room full of DRBGs standing around you? Everyone, please be seeded.” -Quin, atsec tester When things change, it can help to approach that change with a light heart like this. Recently, NIAP announced that Entropy Assessment Rep…