异步Web框架Sanic为什么比DjangoFlask好?如果你要用Python做web开发,我想你会告诉我用Flask或者Django或者tornado,无非就是这三个框架。可能经常逛github的朋友也会说一个fastapi。但是,陛下,时代变了,清朝……已经死了!!!速度优先。目前python已经更新到Python3.9.3。如果你没有用过asyncio和Python3.5新的async/await语法,说明你可能真的是桃花源出身。现在的世界是什么?,不知有无汉,不分魏晋。目前有很多基于async/await语法的异步web框架。你在github上到处都能找到它们,那么你应该选择哪一个呢?github上有一个项目,测试各种语言的各种web框架的速度。我们来看一下简单的数据:LanguageFrameworkSpeed(64)Speed(256)Speed(512)58python(3.9)falcon(2.0)74256.0481538.7682897.6988python(3.9)pyramid(2.0)51298.3056850.3255101.3255python(3.9)asgineer(0.8)44745.5451318.3052105.43104python(3.9)bottle(0.12)39690.4142590.6544329.21107python(3.9)emmett(2.2)35983.9541270.8642295.95115python(3.9)apidaora(0.28)34119.6038263.8738707.73116python(3.9)hug(2.6)34040.9135909.3953828.77125python(3.9)blacksheep(1.0)28887.2233204.4434356.25129python(3.9)index.py(0.16)27273.8129282.4830258.63131python(3.9)starlette(0.14)26693.6631709.5231302.99134python(3.9)responder(2.0)26092.6531092.5832175.53135python(3.9)clastic(19.9)25651.8828936.9928781.05136python(3.9)sanic(21.3)25446.0828833.9829194.50145python(3.9)molten(1.0)18055.0121858.7421906.60146python(3.9)爱欧特p(3.7)17837.0723359.9824128.26149python(3.9)fastapi(0.63)16701.7222402.7222042.29164python(3.9)flask(1.1)12901.8216427.2316521.94176python(3.9)cherrypy(18.6)9328.099396.338832.55177python(3.9)guillotina(6.2)9152.338843.658742.31181PYTHON(3.9)QUART(0.14)7571.287501.086888.888.8881833python(3.9)Tonberry(0.2)7363.126948.6163448.616344.401919191919.9191919191)5722.035728.675624.07210python(3.9)masonite(3.0)2485.302477.632477.29217python(3.9)cyclone(1.3)1597.571591.421577.40218python(3.9)klein(20.6)1501.111538.241513.71220python(3.9)nameko(2.13)1213.251164.901142.60222python(3.9)django-ninja(0.11)1065.371478.171496.42这是所有的Pythonweb框架速度测试,有人会问为什么不从1开始排序,因为这个项目的测试还包括golang,java,php多种语言的web框架一共有226个,这里我们只用Python来做对比。可以明显看出,flask、django、tornado等老牌的Pythonweb框架几乎垫底。哇,这速度绝对是惊人的。也许你还在疑惑如何测试这个速度,我给你看一下测试源码:route("/")defindex():返回""@app.route("/user/",methods=["GET"])defuser_info(id):returnstr(id)@app.route("/user",methods=["POST"])defuser():return""fromdjango.httpimportHttpResponsefromdjango.views.decorators.csrfimportcsrf_exemptdefindex(request):returnHttpResponse(status=200)defget_user(request,id):returnHttpResponse(id)@csrf_exemptdefcreate_user(request):returnHttpResponse(status=200)#禁用所有日志功能importlogginglogging.disable()importtornado.httpserverimporttornado.ioloopimporttornado.ioloopimportMainandHler..web.RequestHandler):defget(self):passclassUserHandler(tornado.web.RequestHandler):defpost(self):passclassUserInfoHandler(tornado.web.RequestHandler)):defget(self,id):self.write(id)app=tornado.web.Application(handlers=[(r"/",MainHandler),(r"/user",UserHandler),(r"/user/(\d+)",UserInfoHandler),])#禁用所有日志功能importlogginglogging.disable()importmultiprocessingfromsanicimportSanicfromsanic.responseimporttextapp=Sanic("benchmark")@app.route("/")asyncdefindex(request):returntext("")@app.route("/user/",methods=["GET"])asyncdefuser_info(request,id):returntext(str(id))@app.route("/user",methods=["POST"])asyncdefuser(request):returntext("")if__name__=="__main__":workers=multiprocessing.cpu_count()应用程序.run(host="0.0.0.0",port=3000,workers=workers,debug=False,access_log=False)什么也不做,只返回响应。虽然这个测试没有什么实际意义,在正常的生产环境中是不可能什么都不做的,但是如果所有的框架都这样测试,一定程度上也可以认为是在同一起跑线上了。OK,就这些了,你应该知道我在这里想说什么异步框架是谁?没错,我们今天的主角就是萨尼奇。为什么要使用异步Web框架?这可能是很多小伙伴首先想到的问题吧?我用Django和Flask都很好,能完成正常任务,为什么要用异步web框架?说到这里,首先我想问你一个问题。你认为谁是我们在web开发过程中最大的敌人?思考5秒钟,然后阅读我的答案:在Web开发中,我们最大的敌人不是用户,而是阻塞!是的,而且异步可以有效解决网络I/O阻塞和文件I/O阻塞。具体阻塞相关的文章,推荐查看深入理解Python异步编程。既然异步可以提高效率,那么对于Python来说,异步是提升性能最好的方式之一。这就是您应该选择异步Web框架的原因。有的生态环境小伙伴可能还会说,你为什么不推荐falcon而是推荐Sanic呢?显然它的速度非常快,比Sanic快那么多,那你可以看下面的代码:fromwsgiref.simple_serverimportmake_serverimportfalconclassThingsResource:defon_get(self,req,resp):"""HandlesGETrequests"""resp.status=falcon.HTTP_200#这是默认状态resp.content_type=falcon.MEDIA_TEXT#默认是JSON,所以重写resp.text=('\n有两件事最让我敬畏,星空''在我头顶和寓意我内心的法则。\n''\n''~ImmanuelKant\n\n')app=falcon.App()things=ThingsResource()app.add_route('/things',things)if__name__=='__main__':withmake_server('',8000,app)ashttpd:print('Servingonport8000...')httpd.serve_forever()必须自己定义并填写一个状态码。我觉得它的速度快是值得肯定的,但是对于开发者来说,又有多少实用价值呢?所以我们选择框架不是为了选择最快的,而是为了快速好用。大多数框架都不具备这样的生态环境,这应该也是大多数Pythonweb开发者愿意选择Django、Flask、tornado的原因。就是因为他们的生态要比其他框架丰富的多。然而,现在不同了。Sanic框架,自2016年5月起,发布了第一版异步Web框架的雏形。从那以后已经5年了。5年来,通过不断的技术积累,Sanic从一个步履蹒跚的小框架,变成了一个行走如飞的坚实框架。在awesome-sanic项目中,记录了大量的第三方库,你可以找到任何常用的工具:从API到Authentication,从Development到Frontend,从Monitoring到ORM,从Caching到Queue……只有你想不到,Nothird-partyextensions它没有。生产环境以前看到国内社区有小伙伴问2020年生产环境能用Sanic吗?答案是肯定的,笔者以亲身经历为证,从2019年底开始,我们就一直在生产环境中使用Sanic。当时Sanic还是19.9,笔者体验了Sanic从19.9到21.3的所有Sanic版本,看到Sanic的生态环境越来越好。还有一个问题你可能不知道。Sanic在创建之初的目标是创建一个可以在生产环境中使用的Web框架。有些框架可能会明确声明内置的Run方法只在测试环境下使用,对于部署环境不要使用内置的Run方法。但是Sanic创建的不仅仅是一个测试环境的应用,而是一个可以直接在生产环境中使用的应用。省去使用独角兽等部署的麻烦!有据可查。大多数PythonWeb开发人员学习的第一个框架是Flask或Django,尤其是Django文档。我想大部分朋友看完之后都会感到沮丧。因为老版本有中文,但是新版本,尤其是新特性,根本就没有中文文档!!!!这对于关注Django开发但英语不是强项的同学来说简直惨不忍睹。但Sanic有完整的中文用户指南和API文档,由贡献者独立发起,官方认可的文档,由译者翻译贡献,由Sanic官方团队发布。可能有朋友会说,Flask也有完整的中文文档,只是在不同的站点。Sanic的所有文档均由Sanic官方发布。并且目前Sanic还在继续支持韩语、葡萄牙语等更多语言。社区指导不同于其他框架。论坛、频道等百度或许能找到,但这些都是本地化的,而且运营商往往不是官方的,里面夹杂着很多广告。显然,如果是官方运营,是不可能的允许这种情况发生。Sanic与其他社区不同的是,所有的论坛和频道都是完全官方运营的。在这里,你可以向核心开发者提问,Sanic的官方发布经理也很乐意解答各种问题。您还可以与志同道合的用户分享您的经验。这是一个完全开放的环境……Sanic目前使用论坛、Discord、githubissues、twitter和Stackoverflow。您可以通过以上方式关注Sanic的发展,寻求社区帮助。你在等什么?何不赶快试试看呢?最后,Sanic的愿景是:构建更快,运行更??快!