基于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中map和列表推导效率比较实例分析
Jun 17 Python
你真的了解Python的random模块吗?
Dec 12 Python
python 判断网络连通的实现方法
Apr 22 Python
浅谈django orm 优化
Aug 18 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
django 模型字段设置默认值代码
Jul 15 Python
python3.7调试的实例方法
Jul 21 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 输出简单动态WAP页面
2009/06/09 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
cookie的secure属性详解
2015/04/08 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
pandas 将索引值相加的方法
2018/11/15 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python框架flask表单实现详解
2019/11/04 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
浅谈Python3中print函数的换行
2020/08/05 Python
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
股份合作协议书范本
2014/04/14 职场文书
部门2015年度工作总结
2015/04/29 职场文书
雨中的树观后感
2015/06/03 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python