基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)


Posted in Python onApril 29, 2020

如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况。尤其是大量更新任务,由于不能批量操作,我们知道pymongo是同步任务机制,相当耗时。

如果采用多线程、多进程的方案确实有效,但编写麻烦、消耗系统资源大(pymongo还不允许fork线程中共用连接)。这里主要瓶颈在于IO,使用单线程异步操作就会效果很好。

Motor是一个异步mongodb driver,支持异步读写mongodb。它通常用在基于Tornado的异步web服务器中。

Motor同时支持使用asyncio(Python3.4以上标准库)作为异步模型,使用起来十分方便。

我们来测试一下效率,使用传统pymongo来进行批量读写 mongo_test.py:

host = '127.0.0.1'
port = 27017
database = 'LiePin'

import time

start = time.clock()

from pymongo import MongoClient

connection = MongoClient(
 host,
 port
)
db = connection[database]

for doc in db.LiePin_Analysis1.find({}, ['_id', 'JobTitle', 'is_end']):
 db.LiePin_Analysis1.update_one({'_id': doc.get('_id')}, {
  '$set': {
   'is_end': 1
  }
 })

elapsed = (time.clock() - start)
print("Time used:",elapsed)

运行一下,发现用了4秒左右

基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)

再使用motor以异步的形式来编写脚本 motor_test.py

host = '127.0.0.1'
port = 27017
database = 'LiePin'

import time

start = time.clock()

import asyncio
from motor.motor_asyncio import AsyncIOMotorClient

connection = AsyncIOMotorClient(
 host,
 port
)
db = connection[database]

async def run():
 async for doc in db.LiePin_Analysis1.find({}, ['_id', 'JobTitle', 'is_end']):
  db.LiePin_Analysis1.update_one({'_id': doc.get('_id')}, {'$set': {'is_end':0}})

asyncio.get_event_loop().run_until_complete(run())

elapsed = (time.clock() - start)
print("Time used:",elapsed)

仅仅1秒左右就完成了任务

基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)

效率由此可见一斑

到此这篇关于基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)的文章就介绍到这了,更多相关python异步读写Mongodb内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
linux下python抓屏实现方法
May 22 Python
Python实现统计代码行的方法分析
Jul 12 Python
python计算auc指标实例
Jul 13 Python
对Python 数组的切片操作详解
Jul 02 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
pytorch 调整某一维度数据顺序的方法
Dec 08 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python 复平面绘图实例
Nov 21 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 #Python
Django分组聚合查询实例分享
Apr 29 #Python
python中sympy库求常微分方程的用法
Apr 28 #Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 #Python
Python startswith()和endswith() 方法原理解析
Apr 28 #Python
Python如何将函数值赋给变量
Apr 28 #Python
Python多线程thread及模块使用实例
Apr 28 #Python
You might like
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
static关键字的用法
2013/10/07 面试题
司机辞职报告范文
2014/01/20 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
品牌服务方案
2014/06/03 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
退休教师追悼词
2015/06/23 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
vue判断按钮是否可以点击
2022/04/09 Vue.js