基于python3.7利用Motor来异步读写Mongodb提高效率
如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况。尤其是大量更新任务,由于不能批量操作,我们知道pymongo是同步任务机制,
顺晟科技
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秒钟
效率由此可见一斑