基于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连接MySQL数据库实例分析
May 12 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
pycharm远程调试openstack代码
Nov 21 Python
Python中max函数用于二维列表的实例
Apr 03 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
numpy数组之存取文件的实现示例
May 24 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
python 实现目录复制的三种小结
Dec 04 Python
一个入门级python爬虫教程详解
Jan 27 Python
Python一些基本的图像操作和处理总结
Jun 23 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生成图形(Libchart)实例
2013/11/06 PHP
PHP中常用的转义函数
2014/02/28 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python读写docx文件的方法
2018/05/08 Python
Python字符串格式化输出代码实例
2019/11/22 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
python Zmail模块简介与使用示例
2020/12/19 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
《维生素c的故事》教学反思
2014/02/18 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
死亡证明书样本说明
2014/10/18 职场文书
故宫的导游词
2015/01/31 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server