基于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实现的金山快盘的签到程序
Jan 17 Python
浅谈django中的认证与登录
Oct 31 Python
python脚本替换指定行实现步骤
Jul 11 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
python将txt文件读取为字典的示例
Dec 22 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
Python实现元素等待代码实例
Nov 11 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
python - timeit 时间模块
Apr 06 Python
深入理解pytorch库的dockerfile
Jun 10 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根据身份证号码计算年龄的实例代码
2014/01/18 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python中正则的使用指南
2016/12/04 Python
pyhton列表转换为数组的实例
2018/04/04 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
北承题目(C++)
2012/05/16 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
自考生自我鉴定范文
2013/10/01 职场文书
会计职业生涯规划书
2014/01/13 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
《穷人》教学反思
2016/02/19 职场文书
导游词之唐山景点
2019/12/18 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS