基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)
如果使用Python做大型海量數(shù)據(jù)批量任務時,并且backend用mongodb做數(shù)據(jù)儲存時,常常面臨大量讀寫數(shù)據(jù)庫的情況。尤其是大量更新任務,由于不能批量操作,我們知道pymongo是同步任務機制,相當耗時。
如果采用多線程、多進程的方案確實有效,但編寫麻煩、消耗系統(tǒng)資源大(pymongo還不允許fork線程中共用連接)。這里主要瓶頸在于IO,使用單線程異步操作就會效果很好。
Motor是一個異步mongodb driver,支持異步讀寫mongodb。它通常用在基于Tornado的異步web服務器中。
Motor同時支持使用asyncio(Python3.4以上標準庫)作為異步模型,使用起來十分方便。
我們來測試一下效率,使用傳統(tǒng)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)
運行一下,發(fā)現(xiàn)用了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秒左右就完成了任務
效率由此可見一斑
到此這篇關(guān)于基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)的文章就介紹到這了,更多相關(guān)python異步讀寫Mongodb內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Ajax常用封裝庫——Axios的使用2. jsp網(wǎng)頁實現(xiàn)貪吃蛇小游戲3. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)4. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera5. 不使用XMLHttpRequest對象實現(xiàn)Ajax效果的方法小結(jié)6. 在 Ubuntu Linux 上安裝 Oracle Java 14的方法7. 如何在?ASP.NET?Core?Web?API?中處理?Patch?請求8. Android Studio進行APP圖標更改的兩種方式總結(jié)9. pybind11: C++ 工程提供 Python 接口的實例代碼10. PHP終止腳本運行三種實現(xiàn)方法詳解
