(python开发服务)(python 微服务框架)

使用 uvloop 和 httptools 开发高性能的 Python Web 服务。

基于 uvloop 和 httptools 可以写出在单CPU内核下每秒能够发出上万个请求的Python网络代码,并且在多内核系统下,还可以使用进程池来进一步来改善系统性能。

Python很慢?

是,也不是。

使用纯 Python 去实现的项目,肯定是慢的,但很少有项目是100%纯 Python的。

比如,你想要用 Python 开发一个超高性能的Web服务,要求并发性能要与go并齐。由于 Python 是一门胶水语言,能够很好地使用一些 c/c++ 库。于是我们从上游技术开始找,很自然地想到服务器网关接口

通用网关接口CGI

还是要扯一下 CGI 的,如果CGI听出茧了,可以忽略本段。

早期的 Web 服务器,只能响应浏览器发来的 HTTP 静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。

后来,在 Web 服务器基础上发展出了动态网页技术。早期的动态网页技术是利用 Web 服务器与外部应用程序(CGI 程序)协作实现的。Web 服务器与外部应用程序之间通用CGI(Common Gateway Interface)网关接口实现数据互通,Web 服务器依然负责数据静态资源响应,而 CGI 程序则负责动态地生成页面。

(python开发服务)(python 微服务框架)

CGI 通用网关接口(Common Gateway Interface)。CGI 标准将这个接口定义的非常简单 (即: WEB 服务器收到客户端的请求后通过环境变量和标准输入(stdin)将数据传递给 CGI 程序, CGI 程序通过标准输出(stdout) 将数据返回给客户端), 所以只要能操作标准输入/输出的程序语言都可以 CGI 程序, 比如: C 语言、 C++、 Java 和 Python 等。

通过CGI实现的网站,每一个请求都会加载一次CGI 程序,反反复复地加载 CGI程序,可想而知性能低下。

为了解决性能问题,于是又有了 FastCGI,PHP-FPM,spawn-fcgi等等的服务器网关接口替代品。

而 Java 也有一套服务器网关接口实现,并且功能更加强大,那就是 Servlet,JSP 是 Servlet 强化。

那么, Python呢?

WSGI

Python 的 Web 服务器网关接口叫做 WSGI(Python Web Server Gateway Interface)。

WSGI 是 Web 服务器与 Python Web 应用程序或框架之间的标准接口。

(python开发服务)(python 微服务框架)

目前主流的 Python Web 应用程序或框架都是基于 WSGI 实现的。

(python开发服务)(python 微服务框架)

但是呢,WSGI 还不能满足我们的需求,我们需要并发能力更强的网关接口。原因是 WSGI 是同步的,在并发时会面临阻塞的问题,而现在我们有更好的选择,那就是ASGI。

ASGI

ASGI,全称为 Asynchronous Server Gateway Interface,是一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket。

为了规范支持异步的 Python Web 服务器、框架和应用之间的通信而定制,同时囊括了同步和异步应用的通信规范,并且向后兼容 WSGI。由于最新的 HTTP 协议支持异步长连接,而传统的 WSGI 应用支持单次同步调用,即仅在接受一个请求后返回响应,从而无法支持 HTTP 长轮询或 WebSocket 连接。在 Python3.5 增加 async/await 特性之后,基于 asyncio 和协程的异步应用编程变得更加方便。ASGI 协议规范就是用于 asyncio 框架的最低限度的底层服务器/应用程序接口。

ASGI 可以帮助 Python 在 Web 框架上和 Node.JS 及 Golang 相竟争!

基于 ASGI 的框架有Sanic、FastAPI,以及DJango 3.0等

接下来,让我们看看 uvicorn 服务器。

Uvicorn

Uvicorn 是基于 uvloop 和 httptools 的 ASGI 服务器,理论上它是 Python 中最高性能的服务器。所有基于 ASGI 的框架都可以使用 Uvicorn 进行部署。

但是我们也不直接用 Uvicorn,你可能 已经看到了,对,是 uvloop 和 httptools。

uvloop 是 Python 内建的 asyncio 事件循环的替代品。uvloop 比 asyncio 更快。实际上,uvloop比 其他任何 Python 异步框架至少快两倍

uvloop 是用 Cython 编写的,并建立在libuv之上。而 libuv 是一种高性能的、跨平台异步快速且稳定的 I/O 类库。

我们还需要一个高性能的HTTP解析器,httptools。

Gunicorn

Gunicorn 是成熟的功能齐全的服务器。Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点,并且能给你使用 Guicorn 来进行进程管理。好处是,可以动态地增加或减少进程数量,平滑地重启工作进程,而且升级服务器也无需停机。

在生产环境中,Guicorn 可以以最简单的方式来管理 Uvicorn。生产环境部署示例:

gunicorn example:app -w 4 -k uvicorn.workers.UvicornWorker

执行上述命令将开设 4 个工作进程,使用了Guicorn 和 Uvicorn 的 worker 类,其中 UvicornWorker 的使用 uvloop 和httptools 实现。

结束语

现在,Python异步生态正在发生着惊天动地的变化,新的框架应运而生(如Sanic、FastAPI),旧的框架正在重构(如Django3.0),很多库也开始支持异步(httpx、Sqlalchemy、Mortor)。

声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者AidenGIS所有,原文出处。若您的权利被侵害,请联系删除。

本文标题:(python开发服务)(python 微服务框架)
本文链接:https://www.51qsb.cn/article/m8qd0.html

(0)
打赏微信扫一扫微信扫一扫QQ扫一扫QQ扫一扫
上一篇2023-02-02
下一篇2023-02-02

你可能还想知道

发表回复

登录后才能评论