Tornado vs Django选型分析

前言

项目中开发的几个服务一直使用tornado作为http服务器,本人也曾提出过疑问,为什么是tornado,得到的答案是比较tornado,flask,django,tornado的并发性能最好,而且最为轻量级。今天好不容易有点空余时间,突然强迫症发作,想搞清楚tornado真的并发比django强吗?为什么django的中间件的优势就被忽略了呢?


1. Tornado vs Django

整体思路就是列举收集到的框架优缺点,然后进行验证,从其他帖子收集到的优缺点汇总如下:

Tornado:
优点:轻量、异步非阻塞IO处理方式、出色的抗负载能力、协程带来优异的处理性能
缺点:没有ORM,提供的支持和模板少,缺少后台支持,对小型项目来说开发速度没有django快
分析:tornado所谓的“缺点”是由它的设计理念决定的,设计上就决定它是一个小而精的http服务器+轻量级web框架,高并发处理才是它真正擅长的

Django:
优点:大而全的框架,全自动化的管理后台带来超高的开发效率,丰富的组件
缺点:厚重,与他自己的ORM高耦合
分析:Django提供的方便,也意味着Django内置的ORM跟框架内的其他模块耦合程度高。应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。Django的卖点是超高的开发效率,其性能扩展有限


2. Django的性能表现

前两天有写一篇django的帖子:传送门
使用jmeter对鉴权接口加压,看django的性能表现。
使用的是双核,8G内存的centos机器,200并发的测试结果:

clipboard.png

tps只有2.6,最大时延到了77s


3. Tornado的性能表现

详情见我另外一个帖子:传送门
当然,被测环境资源完全一致,这里只贴结果:

clipboard.png

最大时延484ms,TPS达到了126


4. 选型结论

并发性能差距这么多,当然与django使用默认的sqlite也有关系,但也一定程度上反应django的orm+模板的机制,在提供丰富功能模板的同时,在性能上也做出了牺牲.不过有帖子贴出的性能对比,django的并发数量居然超过了tornado,不知道数据是否靠谱.

5. 写在最后

本来还想引入sanic的性能表现,但sanic只支持python3.5+版本,手头的环境不满足要求,升级起来比较麻烦,这里先留一个坑,后续有环境再测试对比.
看其他帖子的数据,sanic的 并发性能可能会超过tornado,待后续验证


狂奔的蜗牛
带着敬畏之心,记录、积累对于技术的理解

即使是一只蜗牛,不停努力的奔跑,也能到达目标

10 声望
3 粉丝
0 条评论
推荐阅读
下一次技术革命的思考
互联网革命已经为下一次技术革命夯实了坚实的基础,积累了海量的用户数据,行为数据,以及世界信息,物体,能量流动的数据,有了这些数据的积累,分析,训练,使用,让数据的使用者更容易看清世界的变化趋势,人...

关翔宇阅读 336

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4k评论 1

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 301

Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.3k

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 1.9k评论 4

封面图
打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎鱼。大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。当时我们还想着 Go 团队应该不会接纳,至少不会那么快:懒得翻也可以看我再次...

煎鱼阅读 3.2k

docker 打包 selenium+chromedriver+chrome 遇到的坑和解决方案
docker 跑 selenium 的时候遇到了很多坑,记录一下排坑过程Python 使用 selenium+chromedriver+chrome 实现网页截图Dockerfile {代码...} 让我们一行一行来看RUN (echo "deb http://mirrors.aliyun.com/debi...

ponponon阅读 2k

即使是一只蜗牛,不停努力的奔跑,也能到达目标

10 声望
3 粉丝
宣传栏