基于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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
Python实现在Linux系统下更改当前进程运行用户
Feb 04 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
python实现ID3决策树算法
Aug 29 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
django-allauth入门学习和使用详解
Jul 03 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
pycharm实现猜数游戏
Dec 07 Python
python 实现体质指数BMI计算
May 26 Python
Python max函数中key的用法及原理解析
Jun 26 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
用文本作数据处理
2006/10/09 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
php中static和const关键字用法分析
2016/12/07 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
简单谈谈Python中的闭包
2016/11/30 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
网络教育自我鉴定
2013/11/01 职场文书
房产代理公证处委托书
2014/04/04 职场文书
模具专业求职信
2014/06/26 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
小鞋子观后感
2015/06/05 职场文书
初三语文教学反思
2016/03/03 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
导游词之河北邯郸
2019/09/12 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python