基于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根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
RC4文件加密的python实现方法
Jun 30 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
使用python3实现操作串口详解
Jan 01 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python3+Appium安装使用教程
Jul 05 Python
python元组和字典的内建函数实例详解
Oct 22 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
Django多数据库联用实现方法解析
Nov 12 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
JavaScript类库D
2010/10/24 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
js跳转页面方法总结
2014/01/29 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
Python面向对象编程基础解析(一)
2017/10/26 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python单元测试简单示例
2018/07/03 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
Python类的继承用法示例
2019/01/31 Python
Python3远程监控程序的实现方法
2019/07/15 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
外包公司软件测试工程师
2014/11/01 面试题
优秀学生干部推荐材料
2014/02/03 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
高三家长寄语
2014/04/03 职场文书
应届大学生求职信
2014/07/20 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书