基于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写的一个简单DNS服务器实例
Jun 04 Python
python中sets模块的用法实例
Sep 30 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
九步学会Python装饰器
May 09 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
python制作简单五子棋游戏
Jun 18 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python 定义只读属性的实现方式
Mar 05 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动态生成VRML网页
2006/10/09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
js对字符的验证方法汇总
2015/02/04 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
python简单猜数游戏实例
2015/07/09 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
python绘制规则网络图形实例
2019/12/09 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
应征英语教师求职信
2013/11/27 职场文书
安全生产实施方案
2014/02/23 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
教育见习报告范文
2014/11/03 职场文书
2015年超市工作总结
2015/04/09 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
教育读书笔记
2015/07/02 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js