基于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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 脚本死锁问题与解决方案

    Python 脚本死锁问题与解决方案

    在脚本中,可以创建一个队列来存储子进程的输出,然后由主进程从队列中读取输出并进行处理,这篇文章主要介绍了Python 脚本死锁问题与解决方案,需要的朋友可以参考下
    2024-06-06
  • Python实现求解一元二次方程的方法示例

    Python实现求解一元二次方程的方法示例

    这篇文章主要介绍了Python实现求解一元二次方程的方法,涉及Python基于math包进行数值运算相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • Python3 Loguru输出日志工具的使用

    Python3 Loguru输出日志工具的使用

    使用 Python 来写程序或者脚本的话,常常遇到的问题就是需要对日志进行删除。一方面可以帮助我们在程序出问题的时候排除问题,二来可以帮助我们记录需要关注的信息,这篇文章主要介绍了Python3 Loguru 相见恨晚的输出日志工具,需要的朋友可以参考下
    2022-05-05
  • pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    今天小编就为大家分享一篇pytorch 使用单个GPU与多个GPU进行训练与测试的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 详解从Django Allauth中进行登录改造小结

    详解从Django Allauth中进行登录改造小结

    这篇文章主要介绍了从 Django Allauth 中进行登录改造小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 深入理解Python中的真值和假值概念

    深入理解Python中的真值和假值概念

    在 Python 中,真值和假值是布尔类型的两个唯一可能的值,本文将深入探讨 Python 中的真值和假值概念,帮助你更好地理解和运用它们,感兴趣的可以了解一下
    2023-11-11
  • Python 实现自动登录+点击+滑动验证功能

    Python 实现自动登录+点击+滑动验证功能

    这篇文章主要介绍了Python 实现自动登录+点击+滑动验证功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • python基于 Web 实现 m3u8 视频播放的实例

    python基于 Web 实现 m3u8 视频播放的实例

    这篇文章主要介绍了python基于 Web 实现 m3u8 视频播放的实例的相关资料,需要的朋友可以参考下
    2023-06-06
  • Pandas筛选DataFrame含有空值的数据行的实现

    Pandas筛选DataFrame含有空值的数据行的实现

    本文主要介绍了Pandas筛选DataFrame含有空值的数据行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何使用pyinstaller打包32位的exe程序

    如何使用pyinstaller打包32位的exe程序

    这篇文章主要介绍了如何使用pyinstaller打包32位的exe程序,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05

最新评论