基于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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
详解Python迭代和迭代器
Mar 28 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
利用python循环创建多个文件的方法
Oct 25 Python
Python闭包思想与用法浅析
Dec 27 Python
Python StringIO如何在内存中读写str
Jan 07 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
python实现批量修改文件名
Mar 23 Python
python exit出错原因整理
Aug 31 Python
Selenium Webdriver元素定位的八种常用方式(小结)
Jan 13 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 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
sphinx增量索引的一个问题
2011/06/14 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
es6函数中的作用域实例分析
2020/04/18 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
销售合作意向书范本
2015/05/08 职场文书
新闻稿件写作范文
2015/07/18 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
一文搞懂php的垃圾回收机制
2021/06/18 PHP
浅析MySQL如何实现事务隔离
2021/06/26 MySQL