基於python3.7利用Motor來異步讀寫Mongodb提升效率

原文轉載自「劉悅的技術博客」v3u.cn/a_id_111web

若是使用Python作大型海量數據批量任務時,而且backend用mongodb作數據儲存時,經常面臨大量讀寫數據庫的狀況。尤爲是大量更新任務,因爲不能批量操做,咱們知道pymongo是同步任務機制,至關耗時。mongodb

若是採用多線程、多進程的方案確實有效,但編寫麻煩、消耗系統資源大(pymongo還不容許fork線程中共用鏈接)。這裏主要瓶頸在於IO,使用單線程異步操做就會效果很好。數據庫

Motor是一個異步mongodb driver,支持異步讀寫mongodb。它一般用在基於Tornado的異步web服務器中。bash

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.pyasync

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秒左右就完成了任務oop

效率因而可知一斑測試

原文轉載自「劉悅的技術博客」 v3u.cn/a_id_111

相關文章
相關標籤/搜索