原文转载自「刘悦的技术博客」https://v3u.cn/a_id_111

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

效率由此可见一斑

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_111

最新文章

  1. CentOS6.5网络设置
  2. An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
  3. html 中自动换行的实现方式
  4. IOS第15天(2,事件处理hitTest练习)
  5. win10查看连接过的wifi密码
  6. android layout_weight 使用总结
  7. AngularJS~集成的ajax和服务的注入
  8. 网络流(最大流):CodeForces 499E Array and Operations
  9. linux修改密码
  10. 进程waitpid()的用法
  11. zabbix监控redis
  12. IOS机型margin属性无效问题
  13. 201521123007《Java程序设计》第12周学习总结
  14. C++ 抽象类与接口
  15. MySQL 显示表字段及注释等信息
  16. iOS.XcodeUsage
  17. [转]python与numpy基础
  18. EPANET头文件解读系列2——ENUMSTXT.H
  19. Maven学习(十六)-----Maven存储库
  20. 前端初级技能No.1 [切图]

热门文章

  1. 忽略https域名校验不通过
  2. 429. N-ary Tree Level Order Traversal - LeetCode
  3. 上半年最中意的 GitHub 更新「GitHub 热点速览 v.22.21」
  4. 解放双手!推荐一款 GitHub 星标 8.2k+的命令行软件管理器,非常酷炫!
  5. vs2022+resharper创建模板——实现在新建文件的时候自动生成防卫式声明和自定义语句
  6. linux运维基础1
  7. 解决python 导入selenium 库后自动化运行成功但是报错问题
  8. BUUCTF-LSB
  9. 【RPA之家BluePrism手把手教程】2.3 多重计算
  10. Tapdata 在线研讨会:实时数据同步应用场景及实现方案探讨