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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于python3.7利⽤Motor来异步读写Mongodb提⾼效率
(推荐)
如果使⽤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秒左右就完成了任务
效率由此可见⼀斑
到此这篇关于基于python3.7利⽤Motor来异步读写Mongodb提⾼效率(推荐)的⽂章就介绍到这了,更多相关python异步读写Mongodb内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

相关文档
最新文档