基于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 26 Python
Python合并两个字典的常用方法与效率比较
Jun 17 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
python得到单词模式的示例
Oct 15 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
python 切换root 执行命令的方法
Jan 19 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
Django 构建模板form表单的两种方法
Jun 14 Python
给numpy.array增加维度的超简单方法
Jun 02 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 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
重置版游戏视频
2020/04/09 魔兽争霸
人大复印资料处理程序_补充篇
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
帝国cms常用标签汇总
2015/07/06 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
用django设置session过期时间的方法解析
2019/08/05 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
Python 解决相对路径问题:"No such file or directory"
2020/06/05 Python
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
大学毕业生个人自荐信范文
2014/01/08 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
五好关工委申报材料
2014/05/31 职场文书
安全环保演讲稿
2014/08/28 职场文书
党员年终个人总结
2015/02/14 职场文书
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python