基于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程序实例(通讯录)
Nov 29 Python
Python中的异常处理学习笔记
Jan 28 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
Python多进程原理与用法分析
Aug 21 Python
python实现任意位置文件分割的实例
Dec 14 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
Python极值整数的边界探讨分析
Sep 15 Python
python实现简单石头剪刀布游戏
Oct 24 Python
python程序的组织结构详解
Dec 06 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
PHPlet在Windows下的安装
2006/10/09 PHP
ADODB的数据库封包程序库
2006/12/31 PHP
PHP数组相关函数汇总
2015/03/24 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
flask项目集成swagger的方法
2020/12/09 Python
python 自动识别并连接串口的实现
2021/01/19 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
银行自荐信范文
2013/10/07 职场文书
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
社团成立邀请函
2014/01/08 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis