基于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

相关文章
相关标签/搜索