一、前言
Python语言近年来人气爆棚。它广泛应用于网络开发运营,数据科学,网络开发,以及网络安全问题中。
然而,Python在速度上完全没有优势可言。
在速度上,Java如何同C,C++,C#或者Python相比较?答案几乎完全取决于要运行的应用。在这个问题上,没有完美的评判标准,然而The Computer Language Benchmarks Game 是一个不错的方法。
我想要回答这样一个问题:当运行同一个程序时,为什么Python会 比其他语言慢2到10倍?为什么我们无法将它变得更快?
以下是最主要的原因:
- “它是GIL(Global Interpreter Lock全局解释器锁)”
- “它是解释型语言而非编译语言”
- “它是动态类型语言”
今天,我们不纠结以上哪种原因对性能影响最大,而是来谈谈当下Python3.7中,我们有怎样的方法让他变得比想象中的快,而且快很多
二、开始探索
Python在3.5版本中引入了关于协程的语法糖async和await,这意味着我们可以使用协程的方式来编写Python应用程序,这会让我们的Python代码像Node一样,让他变成异步方式运行
当然,这并不是我们今天的目标
三、进入正题
在众多的Web框架中,Django、Tornado、Flask已经相对成熟,Tornado等框架也可以进行异步方式的选择,但今天我们都不讲
我们要讲的是当下比较强悍的 Sanic
为什么要讲Sanic,我想最主要的的原因是他足够快,而且可以进行快速构建,他写起来类似Flask,口说无凭,看图
这是官方提供的 基准测试结果
Sanic的开发者说他们的灵感来自于这篇文章 uvloop: Blazing fast Python networking
这是在我使用两年来的感受
-
快(爽)到起飞
-
构建速度快
-
原生支持 async/await 语法
-
社区慢慢活跃,相比之前的不成熟慢慢出现一些优秀的插件
-
自动分配&管理进程
只是简单说一下感受,今天的目的不是为了教大家如何使用Sanic,而是希望更多的人加入Sanic,体验到Sanic以及更多优秀的框架的出现带给我们的便捷
三、进阶
说了这么多,还有一个问题,我的Web使用了协程,那么意味着我在操作数据库时,使用常规的pymysql以及psycopg2会阻塞我们的线程,我们的Web服务再快,卡在数据库也是徒劳,那么接下来为大家带来一些我常用的协程支持库
- Postgresql: asyncpg
- Redis: aioredis
- I/O Framework:uvloop
这是我平时用的比较多的一些库,个人喜好pg,至于mysql等其他数据库,大家可以自行搜索
Sanic问世以来,我已经利用它构建过大大小小的Web应用程序,包括他日益完善的社区以及各方面的支持,例如sanic_session等库的出现,让他不再显得那么吃力,让他不再面对大型生产环境而无能为力,到目前为止我一直在热衷于探索他的小插件,如果你们有更好的Sanic支持,请留言
四、擦屁股
我会抽时间将Sanic以及全家桶的教程更新在下方,如果懒,懒,懒的看官方文档,就等我(大哥)更新吧!
- Sanic: Python让你的Web应用程飞起来全家桶之Sanic
- asyncpg
- aioredis
- uvloop
- sanic_session
- sso
- crypto/decrypt
- golang mixin
- middleware
- pub/sub/listeners