基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
作者:刘悦的技术博客 发布时间:2022-12-20 08:44:05
标签:python,异步读写,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秒左右就完成了任务
效率由此可见一斑
来源:https://juejin.im/post/5ea772c1f265da7bac223ac8


猜你喜欢
- 1. 加载数据集这次我们搭建一个小小的多层线性网络对糖尿病的病例进行分类首先先导入需要的库文件先来看看我们的数据集观察可以发现,前八列是我们
- WSGI(Web Server Gateway Interface):Web服务网关接口,是Python中定义的服务器程序和应用程序之间的接
- 最近人工智能等多门课需要复现论文,近两年的论文很多都是基于Pytorch环境做的实验,所以,这里总结一下Pytorch的安装教程,做好最快、
- 目录前言总结:1.代码块的缓存机制2.小数据池3.优缺点小整数对象池大整数对象池字符串驻留机制简单原理:前言本文除"总结"
- 当你碰到下面的asp错误提示时,说明你asp运行脚本超时了! Active Serv
- 首先,来说一下对话框: 对话框在Windows应用程序中使用非常普遍,许多应用程序的设定,与用户交互需要通过对话框来进行,因此对话框是Win
- 从最简单的Web浏览器的登录界面开始,登录界面如下:进行Web页面自动化测试,对页面上的元素进行定位和操作是核心。而操作又是以定位为前提的,
- 这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微
- 正在看的ORACLE教程是:Oracle数据库的备份与恢复。---- 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算
- JSP 获取spring容器中bean的方法总结方案1(Web中使用):ApplicationContext ct = WebApplica
- 看了一个月的文档和资料以后,终于让我参与到项目中来了,哈哈,痛快!虽然只是让我解决一个小问题,不过有活干就是好。在写代码的过程中遇到了一个小
- 女友让我给她论文的图片上加上字母序号,本来觉得是个很简单的事情,但那个白底黑字的圆圈序号却难住了我, 试了几个常用的软件,都不行。后来用 P
- 一、FFmpeg 多个音频合并的2种方法多个mp3文件合并成一个mp3文件一种方法是连接到一起ffmpeg64.exe -i "c
- 1、demo第一个代码是多线程的简单使用,编写了线程如何执行函数和类。import threadingimport timeclass Cl
- 效果展示 准备工作1.canvas的使用主要用到了 bindtouchstart , bindtouchmove 两个属性,捕捉手
- 一、前言介绍xlrd:可以对xlsx、xls、xlsm文件进行读操作且效率高。xlwt:主要对xls文件进行写操作且效率高,但是不能执行xl
- 错误信息:ERROR 1862 (HY000): Your password has expired. To log in you must
- 产品通常分两种,一种是遵循现有用户习惯,一种是颠覆用户习惯。至于什么是用户习惯,你现在用右手还是左手操作鼠标,这就是你的习惯。很多公司团队专
- 本文实例为大家分享了js实现全选取消效果的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html la
- 范围选区概述范围选区是一种常见的对象选择方式,在一个子图中,可以在某一个轴方向上用鼠标选择起始范围的数据,这个特性可用来实现数据缩放(dat