基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)
如果使用Python做大型海量數(shù)據(jù)批量任務(wù)時,并且backend用mongodb做數(shù)據(jù)儲存時,常常面臨大量讀寫數(shù)據(jù)庫的情況。尤其是大量更新任務(wù),由于不能批量操作,我們知道pymongo是同步任務(wù)機(jī)制,相當(dāng)耗時。
如果采用多線程、多進(jìn)程的方案確實(shí)有效,但編寫麻煩、消耗系統(tǒng)資源大(pymongo還不允許fork線程中共用連接)。這里主要瓶頸在于IO,使用單線程異步操作就會效果很好。
Motor是一個異步mongodb driver,支持異步讀寫mongodb。它通常用在基于Tornado的異步web服務(wù)器中。
Motor同時支持使用asyncio(Python3.4以上標(biāo)準(zhǔn)庫)作為異步模型,使用起來十分方便。
我們來測試一下效率,使用傳統(tǒng)pymongo來進(jìn)行批量讀寫 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)
運(yùn)行一下,發(fā)現(xiàn)用了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秒左右就完成了任務(wù)
效率由此可見一斑
到此這篇關(guān)于基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)的文章就介紹到這了,更多相關(guān)python異步讀寫Mongodb內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python操作MongoDB的教程詳解(插,查,改,排,刪)
- 利用Python操作MongoDB數(shù)據(jù)庫的詳細(xì)指南
- python?操作?mongodb?數(shù)據(jù)庫詳情
- 深入了解Python如何操作MongoDB
- Python操作MySQL MongoDB Oracle三大數(shù)據(jù)庫深入對比
- Python 操作 MongoDB 講解詳細(xì)
- MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫
- 使用python向MongoDB插入時間字段的操作
- 如何用python 操作MongoDB數(shù)據(jù)庫
- Python操作MongoDB增刪改查代碼示例
相關(guān)文章
Python實(shí)現(xiàn)求解一元二次方程的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)求解一元二次方程的方法,涉及Python基于math包進(jìn)行數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-06-06pytorch 使用單個GPU與多個GPU進(jìn)行訓(xùn)練與測試的方法
今天小編就為大家分享一篇pytorch 使用單個GPU與多個GPU進(jìn)行訓(xùn)練與測試的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08詳解從Django Allauth中進(jìn)行登錄改造小結(jié)
這篇文章主要介紹了從 Django Allauth 中進(jìn)行登錄改造小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python 實(shí)現(xiàn)自動登錄+點(diǎn)擊+滑動驗(yàn)證功能
這篇文章主要介紹了Python 實(shí)現(xiàn)自動登錄+點(diǎn)擊+滑動驗(yàn)證功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06python基于?Web?實(shí)現(xiàn)?m3u8?視頻播放的實(shí)例
這篇文章主要介紹了python基于?Web?實(shí)現(xiàn)?m3u8?視頻播放的實(shí)例的相關(guān)資料,需要的朋友可以參考下2023-06-06Pandas篩選DataFrame含有空值的數(shù)據(jù)行的實(shí)現(xiàn)
本文主要介紹了Pandas篩選DataFrame含有空值的數(shù)據(jù)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07