基于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 时间处理datetime实例
Sep 06 Python
python实现通过shelve修改对象实例
Sep 26 Python
Python列表append和+的区别浅析
Feb 02 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
python 调用有道api接口的方法
Jan 03 Python
python的pstuil模块使用方法总结
Jul 26 Python
wxPython实现列表增删改查功能
Nov 19 Python
python绘制BA无标度网络示例代码
Nov 21 Python
python 实现屏幕录制示例
Dec 23 Python
Python chardet库识别编码原理解析
Feb 18 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
python pygame 开发五子棋双人对弈
May 02 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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
利用php输出不同的心形图案
2016/04/22 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
Python2.x与Python3.x的区别
2016/01/14 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python 实现图片批量压缩的示例
2020/12/18 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
致运动员的广播稿
2015/08/19 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
Python实现双向链表基本操作
2022/05/25 Python