基于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使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
python3 shelve模块的详解
Jul 08 Python
Python中sort和sorted函数代码解析
Jan 25 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
Python类装饰器实现方法详解
Dec 21 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
python使用布隆过滤器的实现示例
Aug 20 Python
Django缓存Cache使用详解
Nov 30 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的知识
2006/11/17 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
接收键盘指令的脚本
2006/06/26 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
js轮播图代码分享
2016/07/14 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
webpack将js打包后的map文件详解
2018/02/22 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
学习退步检讨书
2014/09/28 职场文书
模范教师事迹材料
2014/12/16 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
nginx配置限速限流基于内置模块
2022/05/02 Servers