基于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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
Python类定义和类继承详解
May 08 Python
Python如何为图片添加水印
Nov 25 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
Pytorch: 自定义网络层实例
Jan 07 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
Python 无限级分类树状结构生成算法的实现
Jan 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实现微信公众平台音乐点播
2014/03/20 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
javascript时区函数介绍
2012/09/14 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python实现把数字转换成中文
2015/06/29 Python
python实现实时监控文件的方法
2016/08/26 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
使用Python的turtle模块画国旗
2019/09/24 Python
python logging模块的使用详解
2020/10/23 Python
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
师范生见习报告
2014/10/31 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
网络研修心得体会
2016/01/08 职场文书