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

2020-09-28 0 838

如果使用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秒左右

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

再使用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秒左右就完成了任务

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

效率由此可见一斑

到此这篇关于基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)的文章就介绍到这了,更多相关python异步读写Mongodb内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

遇见资源网 Python 基于python3.7利用Motor来异步读写Mongodb提高效率(推荐) http://www.ox520.com/25443.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务