基于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中bisect的用法
Sep 23 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
Python中的with...as用法介绍
May 28 Python
python3.4爬虫demo
Jan 22 Python
Python File(文件) 方法整理
Feb 18 Python
python实现简单图片物体标注工具
Mar 18 Python
PyQt5显示GIF图片的方法
Jun 17 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
python torch.utils.data.DataLoader使用方法
Apr 02 Python
使用keras2.0 将Merge层改为函数式
May 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 数组遍历顺序理解
2009/09/09 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
php数组指针操作详解
2017/02/14 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
机器学习python实战之决策树
2017/11/01 Python
浅谈Django REST Framework限速
2017/12/12 Python
Python中dict和set的用法讲解
2019/03/28 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
教师业务学习制度
2014/01/25 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
导师工作推荐信
2015/03/27 职场文书
合同补充协议书
2016/03/24 职场文书
好段摘抄大全(48句)
2019/08/08 职场文书