基于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 中整型对象存储的位置
May 16 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
在python里面运用多继承方法详解
Jul 01 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
Python文本处理简单易懂方法解析
Dec 19 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
Json解析的方法小结
2016/06/22 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
让 python 命令行也可以自动补全
2014/11/30 Python
Python解析nginx日志文件
2015/05/11 Python
Django的信号机制详解
2017/05/05 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
python3中的md5加密实例
2018/05/29 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
感恩节活动方案
2014/01/27 职场文书
担保书怎么写
2014/04/01 职场文书
六年级学生评语
2014/04/22 职场文书