首页 > 上网技巧 > 电脑小技巧 > 基于python3.7利用Motor来异步读写Mongodb提高...

基于python3.7利用Motor来异步读写Mongodb提高效率

时间:2019-09-16 14:08 作者:QQ地带 我要评论

如果使用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 = 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.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秒左右就完成了任务
 
    
 
 
    效率由此可见一斑

标签: Python
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告