18910140161

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

顺晟科技

2021-06-16 10:48:48

370

如果Python用于大规模海量数据批量任务,后端使用mongodb进行数据存储,往往会面临大量数据库读写的情况。特别是对于大量的更新任务,我们知道pymongo是一种同步任务机制,相当耗时。

如果多线程多进程方案有效,写起来比较麻烦,消耗大量系统资源(pymongo不允许分叉线程共享连接)。这里的主要瓶颈是IO,使用单线程异步操作会非常有效。

Motor是异步mongodb驱动,支持异步读写mongodb。它通常用于基于Tornado的异步web服务器。

同时Motor支持asyncio(Python3.4或以上标准库)作为异步模型,使用非常方便。

让我们测试一下效率,用传统的pymongo批量读写mongo_test.py:

主机='127.0.0.1 '

port=27017

数据库='LiePin '

导入时间

start=time.clock()

从pymongo导入MongoClient

connection=MongoClient(

主持人,

港口

)

db=连接[数据库]

对于数据库中的文档。LiePin_Analysis1.find({},['_id ',' JobTitle ',' is_end']):

db。LiePin _ analysis 1 . update _ one({ ' _ id ' : doc . get(' _ id ')},{

$set': {

is_end': 1

}

})

流逝=(time.clock() - start)

打印(已用时间:秒)

运行它,发现它花了大约4秒钟

然后用motor以异步方式编写脚本motor_test.py

主机='127.0.0.1 '

port=27017

数据库='LiePin '

导入时间

start=time.clock()

进口海关

来自motor.motor_asyncio导入AsyncIOMotorClient

connection=AsyncIOMotorClient(

主持人,

港口

)

db=连接[数据库]

async def run():

数据库中文档的异步。LiePin_Analysis1.find({},['_id ',' JobTitle ',' is_end']):

db。LiePin _ analysis 1 . update _ one({ ' _ id ' : doc . get(' _ id ')},{'$set': {'is_end':0}})

asyncio.get_event_loop()。run _直到_complete(run())

流逝=(time.clock() - start)

打印(已用时间:秒)

完成这项任务只花了大约1秒钟

效率由此可见一斑

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航