• 基于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秒左右就完成了任务

  • 相关阅读:
    [Learn AF3]第二章 App Framework 3.0的组件View——AF3的驱动引擎
    [Learn AF3]第一章 如何使用App Framework 3.0 构造应用程序
    [译]Intel App Framework 3.0的变化
    手机浏览器中屏蔽img的系统右键菜单context menu
    HTML5 touche vents drag to move & AF actionsheet by longTap
    HTML5 FileReader
    【转】Gulp入门基础教程
    【Intel AF 2.1 学习笔记三】
    【Intel AF 2.1 学习笔记二】AF中的页面——Panel
    【Intel AF 2.1 学习笔记一】AF程序结构
  • 原文地址:https://www.cnblogs.com/yunlongaimeng/p/15632845.html
Copyright © 2020-2023  润新知