基于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 = 27017database = ’LiePin’import timestart = time.clock()from pymongo import MongoClientconnection = 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 = 27017database = ’LiePin’import timestart = time.clock()import asynciofrom motor.motor_asyncio import AsyncIOMotorClientconnection = 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内容请搜索好吧啦网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好吧啦网!
相关文章:
1. Python unittest生成测试报告过程解析2. php去掉数组的第一个值的两个函数:array_shift、array_splice3. python matplotlib工具栏源码探析二之添加、删除内置工具项的案例4. CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chrome、Opera5. CSS3实例分享之多重背景的实现(Multiple backgrounds)6. Django-simple-captcha验证码包使用方法详解7. 用PHP读取和编写XML DOM8. uni-app结合PHP实现单用户登陆demo及解析9. 如何基于python3和Vue实现AES数据加密10. 解决VUE项目使用Element-ui 下拉组件的验证失效问题

网公网安备