共计 4497 个字符,预计需要花费 12 分钟才能阅读完成。
如果说要用 Python 进行 web 开发,我想你肯定会通知我 应用 Flask 或者 Django 再或者 tornado,用来用去无非就这三种框架。可能逛 github 多的敌人还会说一个 fastapi。然而,皇上,时代变了,大清… 亡了!!!
速度为先
当下,python 都曾经更新到了 Python3.9.3 了,如果你还没有应用过 asyncio、和 Python3.5 新增的 async/await 语法,那阐明你可能真的是桃花源人,问今是何世,不知有汉,无论魏晋了。
在当下,基于 async/await 语法的异步 Web 框架也有很多,在 github 上找一找亘古未有是,那到底应该选哪一款呢?在 github 上有一个专门测试各种语言各种 Web 框架速度的我的项目,咱们来看一看简略的数据:
这是所有的 Python Web 框架速度测试,有人可能会问为什么不是从 1 开始排序的,因为这个我的项目的测试还蕴含 golang、java、php 等泛滥语言的 Web 框架,共有 226 款。这里咱们只用 Python 来做比照。
能够显著的看到,flask、django、tornado 等老牌的 Python Web 框架曾经快要垫底了。
wow,这个速度绝了。可能你们还在狐疑这个速度如何测试的,给你们看一下测试源码:
# Disable all logging features
import logging
logging.disable()
from flask import Flask
from meinheld import patch
patch.patch_all()
app = Flask(__name__)
@app.route("/")
def index():
return ""@app.route("/user/<int:id>", methods=["GET"])
def user_info(id):
return str(id)
@app.route("/user", methods=["POST"])
def user():
return ""
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
def index(request):
return HttpResponse(status=200)
def get_user(request, id):
return HttpResponse(id)
@csrf_exempt
def create_user(request):
return HttpResponse(status=200)
复制代码
# Disable all logging features
import logging
logging.disable()
import tornado.httpserver
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
pass
class UserHandler(tornado.web.RequestHandler):
def post(self):
pass
class UserInfoHandler(tornado.web.RequestHandler):
def get(self, id):
self.write(id)
app = tornado.web.Application(
handlers=[(r"/", MainHandler),
(r"/user", UserHandler),
(r"/user/(\d+)", UserInfoHandler),
]
)
复制代码
# Disable all logging features
import logging
logging.disable()
import multiprocessing
from sanic import Sanic
from sanic.response import text
app = Sanic("benchmark")
@app.route("/")
async def index(request):
return text("")
@app.route("/user/<id:int>", methods=["GET"])
async def user_info(request, id):
return text(str(id))
@app.route("/user", methods=["POST"])
async def user(request):
return text("")
if __name__ == "__main__":
workers = multiprocessing.cpu_count()
app.run(host="0.0.0.0", port=3000, workers=workers, debug=False, access_log=False)
复制代码
就是简略的不做任何操作,只返回响应,尽管这样测试没有任何实际意义,在失常的生产环境中不可能什么都不做,然而如果所有的框架都如此测试,也算是从肯定水平上在同一起跑线上了吧。
OK,就这么多,说到这里你也应该晓得我想要说的这个异步框架是谁了,没错,咱们明天的配角就是 Sanic**。
为什么要用异步 Web 框架?
这可能是泛滥小伙伴最先想到的问题了吧?我用 Django、Flask 用的好好的,可能实现失常的工作,为什么还要用异步 Web 框架呢?
说到这里,首先我要反诘你你一个问题,你认为在 Web 开发过程中咱们最大的敌人是谁?思考 5 秒钟,而后看看我的答复:
在 Web 开发的过程中,咱们最大的敌人不是用户,而是阻塞!
是的,而异步能够无效的解决 网络 I/O 阻塞,文件 I/O 阻塞。具体的阻塞相干的文章举荐查看深刻了解 Python 异步编程。因为异步能够晋升效率,所以对于 Python 来说,异步是最好的晋升性能的形式之一。这也是为什么要抉择 异步 Web 框架的起因。
生态环境
可能有的小伙伴还是会说,你为什么不举荐 falcon 而是举荐 Sanic?明明它的速度十分快,要比 Sanic 快了那么多,那您看一下上面的代码:
from wsgiref.simple_server import make_server
import falcon
class ThingsResource:
def on_get(self, req, resp):
"""Handles GET requests"""
resp.status = falcon.HTTP_200 # This is the default status
resp.content_type = falcon.MEDIA_TEXT # Default is JSON, so override
resp.text = ('\nTwo things awe me most, the starry sky'
'above me and the moral law within me.\n'
'\n'
'~ Immanuel Kant\n\n')
app = falcon.App()
things = ThingsResource()
app.add_route('/things', things)
if __name__ == '__main__':
with make_server('', 8000, app) as httpd:
print('Serving on port 8000...')
httpd.serve_forever()
一个状态码都要本人定义和填写的框架,我想它的速度快是值得必定的,然而对于开发者来说,又有多少的实用价值呢?所以咱们抉择框架并不是要选最快的,而是要又快又好用的。
而大多数框架并不具备这样的生态环境,这应该也是为什么大多数 Python 的 Web 开发者违心抉择 Django、Flask、tornado 的起因。就是因为它们的生态绝对于其余框架要丰盛太多太多。
可是,现在不一样了。Sanic 框架,从 2016 年 5 月开始 公布了第一版异步 Web 框架雏形,至今曾经走过了 5 个年头,这 5 年,通过一直地技术积攒,Sanic 曾经由一个步履蹒跚的小框架变成了一个健步如飞的稳重框架。
在 awesome-sanic 我的项目中,记录了大量的第三方库,你能够找到任何罕用的工具:从 API 到 Authentication,从 Development 到 Frontend,从 Monitoring 到 ORM,从 Caching 到 Queue… 只有你想不到的,没有它没有的第三方拓展。
生产环境
以前我在国内的社区中看到过一些小伙伴在问 2020 年了,Sanic 能够用于生产环境了吗?
答案是必定的,笔者以亲身经历来作证,从 19 年底,咱们就曾经将 Sanic 用于生产环境了。彼时的 Sanic 还是 19.9,笔者经验了 Sanic 19.9 — 21.3 所有的 Sanic 的版本,眼看着 Sanic 的生态环境变得越来越棒。
还有一个问题可能你们不晓得,Sanic 在创立之初指标就是创立一个能够用于生产环境的 Web 框架。可能有些框架会明确的阐明框架中自带的 Run 办法仅用于测试环境,不要应用自带的 Run 办法用于部署环境。然而 Sanic 所创立的不止是一个用于测试环境的利用,更是能够间接用在生产环境中的利用。省去了应用 unicorn 等部署的懊恼!
文档欠缺
想必大多数 Python 的 Web 开发者 学的第一个框架就是 Flask 或者 Django 吧,尤其是 Django 的文档,我想大多数小伙伴看了都会心塞。因为旧的版本有中文,然而新的版本,尤其是新个性,齐全没有任何中文文档了!!!!这对于关注 Django 倒退但英文又不是强项的同学来说,几乎苦不堪言。
但 Sanic 领有欠缺的 中文用户指南 和 API 文档,这些都是由贡献者自主发动的,官网抵赖的文档,由翻译者进行翻译奉献,由 Sanic 官网团队进行公布。或者有的小伙伴会说 Flask 也有欠缺的中文文档,然而那是在不同的站点上的,Sanic 的所有文档都有 Sanic 官网进行公布反对。且目前 Sanic 还在继续反对 韩语、葡萄牙语等更多的语种。
社区领导
和其余框架不同,您或者可能在百度上找到论坛、频道等,但这些都是通过本地汉化的,运营者往往并不是官网,且其中夹杂了很多广告。很显然,如果是官网经营的不可能容许这种状况呈现。
Sanic 不同于其余的社区,所有的论坛、频道齐全由官网经营,在这里,你能够向外围开发者发问问题,Sanic 的官网公布经理也十分乐意答复各种问题。你也能够和气味相投的使用者分享本人的应用教训。这是一个齐全凋谢的环境….
Sanic 目前罕用的有 论坛、Discord、github issues、twitter、Stackoverflow
大家能够在以上的形式中关注 Sanic 的倒退以及寻求社区帮忙。
你还在等什么?还不连忙去试一下?最初,以 Sanic 的愿景结尾:Build Faster,Run Faster !
Python 进阶笔记、最新面试温习笔记 PDF,我的 GitHub
文末
您的点赞珍藏就是对我最大的激励!
欢送关注我,分享 Python 干货,交换 Python 技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!