知行编程网知行编程网  2022-04-17 01:00 知行编程网 隐藏边栏 |   抢沙发  75 
文章评分 0 次,平均分 0.0
Python在3.4引入了 asyncio 库,3.6新增了关键字 asyncawait,此后,异步框架迅速发展了起来,性能上能和Node.js比肩,除非是CPU密集型任务,否则没有理由不适用异步框架。

如果你是Web开发者,现在异步Web框架上有了更多选择!

1、Tornado

Tornado 根本不是什么新框架,它最初是由FriendFeed(后被Facebook收购)在2009年发布。从一开始就提供有异步编程的功能。
5个顶级异步Python框架

Tornado 不仅仅是Web框架,同时它内置了很多异步模块,可用于自己构建异步应用。这些模块包括:
  • 协同程序和其他原语(tornado.gen,tornado.locks,tornado.queues等)
  • 网络模块(tornado.ioloop,tornado.iostream)
  • 异步服务器和客户端(tornado.httpserver,httpclient,等)

通过这些模块,Tornado 构建了自己的异步Web框架模块。
<section style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;white-space: pre;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);padding: 0.5em;background: rgb(0, 0, 0);color: rgb(248, 248, 248);text-size-adjust: none;line-height: 1.75em;display: block !important;"><span style="font-size: 16px;"><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">import</span> tornado.ioloop</span><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">import</span> tornado.web</span><br  /><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">class</span> <span style="color: rgb(255, 255, 182);">MainHandler</span>(tornado.web.RequestHandler):</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">get</span>(self):</span><br  /><span style="letter-spacing: 0.5px;">        self.write(<span style="color: rgb(168, 255, 96);">"Hello, world"</span>)</span><br  /><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">make_app</span>():</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> tornado.web.Application([</span><br  /><span style="letter-spacing: 0.5px;">        (<span style="color: rgb(168, 255, 96);">r"/"</span>, MainHandler),</span><br  /><span style="letter-spacing: 0.5px;">    ])</span><br  /><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">if</span> __name__ == <span style="color: rgb(168, 255, 96);">"__main__"</span>:</span><br  /><span style="letter-spacing: 0.5px;">    app = make_app()</span><br  /><span style="letter-spacing: 0.5px;">    app.listen(<span style="color: rgb(255, 115, 253);">8888</span>)</span><br  /><span style="letter-spacing: 0.5px;">    tornado.ioloop.IOLoop.current().start()</span></span></section>
Tornado在Python社区中拥有很多追随者,并且经验丰富的架构师使用它们来构建功能强大的系统。这个框架长期以来一直在解决并发问题,但是由于它不支持WSGI标准(大部分Python库仍在同步中),因此尚未成为主流。
国内据说知乎是基于Torando构建的。

2、 Snaic

Sanic是一个诞生有3年的框架:它只支持3.6以上Python版本,支持通用的async / await语法,开箱即用,因此你无需阅读大量文档就可以写出你的一个HTTP 处理器。
5个顶级异步Python框架
除了async关键字之外,语法上和 flask 基于没差别。
<section style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;white-space: pre;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);padding: 0.5em;background: rgb(0, 0, 0);color: rgb(248, 248, 248);text-size-adjust: none;line-height: 1.75em;display: block !important;"><span style="font-size: 16px;"><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">from</span> sanic <span style="color: rgb(150, 203, 254);">import</span> Sanic</span><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">from</span> sanic.response <span style="color: rgb(150, 203, 254);">import</span> json</span><br  /><br  /><span style="letter-spacing: 0.5px;">app = Sanic()</span><br  /><br  /><span style="color: rgb(255, 255, 182);letter-spacing: 0.5px;">@app.route("/")</span><br  /><span style="letter-spacing: 0.5px;">async <span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">test</span>(request):</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> json({<span style="color: rgb(168, 255, 96);">"hello"</span>: <span style="color: rgb(168, 255, 96);">"world"</span>})</span><br  /><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">if</span> __name__ == <span style="color: rgb(168, 255, 96);">"__main__"</span>:</span><br  /><span style="letter-spacing: 0.5px;">    app.run(host=<span style="color: rgb(168, 255, 96);">"0.0.0.0"</span>, port=<span style="color: rgb(255, 115, 253);">8000</span>)</span></span></section>
Sanic可以说是Python世界中最流行和最受欢迎的异步框架。它具有你项目中需要的所有功能:路由,中间件,Cookie,版本控制,蓝图,基于类的视图,静态文件,流,sockets,此外你还可以集成模板,数据库驱动,文件I / O,队列等等。

3、Vibora

Vibora和Sanic非常像,致力于成为最快的Python Web服务器。他们网站首页有一个框架比较图:
5个顶级异步Python框架

Vibora声称比其它框架快几倍,比竞争对手Sanic还快两倍多。当然,这个基准测试要持怀疑态度。
尽管在语法和功能上,Vibora可以与Sanic媲美但我认为Sanic更加成熟,因为它已经存在了很长一段时间并且具有更大的社区。
<section style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;white-space: pre;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);padding: 0.5em;background: rgb(0, 0, 0);color: rgb(248, 248, 248);text-size-adjust: none;line-height: 1.75em;display: block !important;"><span style="font-size: 16px;"><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">from</span> vibora <span style="color: rgb(150, 203, 254);">import</span> Vibora, JsonResponse</span><br  /><br  /><span style="letter-spacing: 0.5px;">app = Vibora()</span><br  /><br  /><span style="color: rgb(255, 255, 182);letter-spacing: 0.5px;">@app.route('/')</span><br  /><span style="letter-spacing: 0.5px;">async <span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">home</span>():</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> JsonResponse({<span style="color: rgb(168, 255, 96);">'hello'</span>: <span style="color: rgb(168, 255, 96);">'world'</span>})</span><br  /><br  /><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">if</span> __name__ == <span style="color: rgb(168, 255, 96);">'__main__'</span>:</span><br  /><span style="letter-spacing: 0.5px;">    app.run(host=<span style="color: rgb(168, 255, 96);">"0.0.0.0"</span>, port=<span style="color: rgb(255, 115, 253);">8000</span>)</span></span></section>

4、Quart

如果您喜欢Flask,但又要支持异步, 那么Quart你一定会喜欢
5个顶级异步Python框架
Quart符合ASGI标准,该标准是WSGI标准的后继产品,并提供异步支持。Quart不仅与Flask相似,而且与Flask API兼容!该框架的作者希望保留了Flask的风格,只是向其中添加异步、WebSocket和HTTP 2支持。因此,你可以从Flask文档中学习Quart的用法,只需要记住Quart中的函数是异步的就行。
<section style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;white-space: pre;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);padding: 0.5em;background: rgb(0, 0, 0);color: rgb(248, 248, 248);text-size-adjust: none;line-height: 1.75em;display: block !important;"><span style="font-size: 16px;"><span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">from</span> quart <span style="color: rgb(150, 203, 254);">import</span> Quart</span><br  /><br  /><span style="letter-spacing: 0.5px;">app = Quart(__name__)</span><br  /><br  /><span style="color: rgb(255, 255, 182);letter-spacing: 0.5px;">@app.route('/')</span><br  /><span style="letter-spacing: 0.5px;">async <span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">hello</span>():</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> <span style="color: rgb(168, 255, 96);">'hello'</span></span><br  /><br  /><span style="letter-spacing: 0.5px;">app.run()</span></span></section>
几乎完全像Flask
由于Quart是从Flask中演进过来的,因此Flask的所有功能均可用:路由,中间件,会话,模板,蓝图等。实际上,你甚至可以直接在Quart内部使用Flask的扩展插件。不过,有一个问题是它仅支持Python 3.7+。

5、FastAPI

FastAPI似乎是异步 Python 框架里功能、文档最丰富的框架。
5个顶级异步Python框架
该框架的作者深入研究了其他几个框架,从诸如Django到Sanic之类的现代框架,以及NestJS(Node.js,Typescript Web框架)。
语法甚至可以说它比我们遇到的其他框架更有趣:
<section style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;white-space: pre;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);padding: 0.5em;background: rgb(0, 0, 0);color: rgb(248, 248, 248);text-size-adjust: none;line-height: 1.75em;display: block !important;"><span style="font-size: 16px;"><span style="letter-spacing: 0.5px;">rom fastapi <span style="color: rgb(150, 203, 254);">import</span> FastAPI</span><br  /><br  /><span style="letter-spacing: 0.5px;">app = FastAPI()</span><br  /><br  /><span style="color: rgb(255, 255, 182);letter-spacing: 0.5px;">@app.get("/users/me")</span><br  /><span style="letter-spacing: 0.5px;">async <span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">read_user_me</span>():</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> {<span style="color: rgb(168, 255, 96);">"user_id"</span>: <span style="color: rgb(168, 255, 96);">"the current user"</span>}</span><br  /><br  /><span style="color: rgb(255, 255, 182);letter-spacing: 0.5px;">@app.get("/users/{user_id}")</span><br  /><span style="letter-spacing: 0.5px;">async <span style="color: rgb(150, 203, 254);">def</span> <span style="color: rgb(255, 255, 182);">read_user</span>(user_id: str):</span><br  />    <span style="letter-spacing: 0.5px;"><span style="color: rgb(150, 203, 254);">return</span> {<span style="color: rgb(168, 255, 96);">"user_id"</span>: user_id}</span></span></section>
FastAPI胜过其他框架的杀手锏,自动生成API文档:
编写API接口后,你就可以使用符合标准的UI如SwaggerUI,ReDoc等来使用API。

5个顶级异步Python框架



那性能呢?FastAPI是基于Starlette库构建的,其性能可与Node相匹配,在某些情况下甚至可以与Go相匹配。总而言之,我真的有一种感觉,FastAPI将成为Python的顶级异步框架。

总结

如今,Python异步生态正在发生很多事情。出现了新的框架,旧的框架正在重写,很多库开始支持异步行为。对于Web框架,Python已准备就绪,可提供出色的性能。如果很长一段时间你在考虑迁移到Node或者go,那现在不需要了。
参考链接:https://geekflare.com/python-asynchronous-web-frameworks/

近期热门:

学会Python这项技能,再也不怕你孩子偷偷玩电脑游戏了

过年扫五福,干脆我用Python做一个五福生成器



菜鸟学Python 趣味干货视频已经上线B站


 点击阅读原文 看B站视频

本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享