基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)

 更新时间:2020年04月29日 09:17:50   作者:刘悦的技术博客  
Motor是一个异步mongodb driver,支持异步读写mongodb。它通常用在基于Tornado的异步web服务器中。这篇文章主要介绍了基于python3.7利用Motor来异步读写Mongodb提高效率,需要的朋友可以参考下

如果使用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秒左右

再使用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提高效率(推荐)的文章就介绍到这了,更多相关python异步读写Mongodb内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Anaconda环境克隆、迁移的详细步骤

    Anaconda环境克隆、迁移的详细步骤

    最近需要在多台计算机上工作,每次重新部署环境比较麻烦,所以学习一下anaconda环境迁移的方法,下面这篇文章主要给大家介绍了关于Anaconda环境克隆、迁移的详细步骤,需要的朋友可以参考下
    2022-08-08
  • python+matplotlib实现礼盒柱状图实例代码

    python+matplotlib实现礼盒柱状图实例代码

    这篇文章主要介绍了python+matplotlib实现礼盒柱状图实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 手把手教你利用opencv实现人脸识别功能(附源码+文档)

    手把手教你利用opencv实现人脸识别功能(附源码+文档)

    最近搞一个人脸识别的项目练练手,不得不感叹opencv做人脸检测实在是强,这篇文章主要给大家介绍了关于利用opencv实现人脸识别功能的相关资料,并附上了源码以及文档,需要的朋友可以参考下
    2021-09-09
  • 简单的Python调度器Schedule详解

    简单的Python调度器Schedule详解

    这篇文章主要介绍了简单的Python调度器Schedule详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python3 tkinter 实现文件读取及保存功能

    Python3 tkinter 实现文件读取及保存功能

    tkinter是一个跨平台的GUI库,开发的程序可以在win,linux或者mac下运行,tkinter是python自带的GUI库,是对图形库TK的封装。本文通过实例代码给大家介绍Python3 tkinter 实现文件读取及保存功能,感兴趣的朋友跟随小编一起看看吧
    2019-09-09
  • pycharm 批量修改变量名称的方法

    pycharm 批量修改变量名称的方法

    这篇文章主要介绍了pycharm 批量修改变量名称的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 详解opencv中画圆circle函数和椭圆ellipse函数

    详解opencv中画圆circle函数和椭圆ellipse函数

    这篇文章主要介绍了opencv中画圆circle函数和椭圆ellipse函数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • python实现图像识别功能

    python实现图像识别功能

    这篇文章主要为大家详细介绍了python实现图像识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python中的变量与常量

    Python中的变量与常量

    本文基于Python基础,主要介绍了Python基础中变量和常量的区别,对于变量的用法做了详细的讲解,用丰富的案例 ,代码效果图的展示帮助大家更好理解,需要的朋友可以参考下
    2021-11-11
  • pytorch模型训练的时候GPU使用率不高的问题

    pytorch模型训练的时候GPU使用率不高的问题

    这篇文章主要介绍了pytorch模型训练的时候GPU使用率不高的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论