ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-02 14:04:27  阅读:239  来源: 互联网

标签:异步 Mongodb time db python3.7 Motor LiePin import id


 如果使用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秒左右就完成了任务

标签:异步,Mongodb,time,db,python3.7,Motor,LiePin,import,id
来源: https://www.cnblogs.com/yunlongaimeng/p/15632845.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有