如何用Python写出每秒上万个请求Web代码?
使用 uvloop 和 httptools 开发高性能的 Python Web 服务。
基于 uvloop 和 httptools 可以写出在单CPU内核下每秒能够发出上万个请求的Python网络代码,并且在多内核系统下,还可以使用进程池来进一步来改善系统性能。
是,也不是。
使用纯 Python 去实现的项目,肯定是慢的,但很少有项目是100%纯 Python的。
比如,你想要用 Python 开发一个超高性能的Web服务,要求并发性能要与go并齐。由于 Python 是一门胶水语言,能够很好地使用一些 c/c++ 库。于是我们从上游技术开始找,很自然地想到服务器网关接口。
还是要扯一下 CGI 的,如果CGI听出茧了,可以忽略本段。
早期的 Web 服务器,只能响应浏览器发来的 HTTP 静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。
后来,在 Web 服务器基础上发展出了动态网页技术。早期的动态网页技术是利用 Web 服务器与外部应用程序(CGI 程序)协作实现的。Web 服务器与外部应用程序之间通用CGI(Common Gateway Interface)网关接口实现数据互通,Web 服务器依然负责数据静态资源响应,而 CGI 程序则负责动态地生成页面。
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呢?
Python 的 Web 服务器网关接口叫做 WSGI(Python Web Server Gateway Interface)。
WSGI 是 Web 服务器与 Python Web 应用程序或框架之间的标准接口。
目前主流的 Python Web 应用程序或框架都是基于 WSGI 实现的。
但是呢,WSGI 还不能满足我们的需求,我们需要并发能力更强的网关接口。原因是 WSGI 是同步的,在并发时会面临阻塞的问题,而现在我们有更好的选择,那就是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 是基于 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 是成熟的功能齐全的服务器。Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点,并且能给你使用 Guicorn 来进行进程管理。好处是,可以动态地增加或减少进程数量,平滑地重启工作进程,而且升级服务器也无需停机。
在生产环境中,Guicorn 可以以最简单的方式来管理 Uvicorn。生产环境部署示例:
执行上述命令将开设 4 个工作进程,使用了Guicorn 和 Uvicorn 的 worker 类,其中 UvicornWorker 的使用 uvloop 和httptools 实现。
现在,Python异步生态正在发生着惊天动地的变化,新的框架应运而生(如Sanic、FastAPI),旧的框架正在重构(如Django3.0),很多库也开始支持异步(httpx、Sqlalchemy、Mortor)。
一个简单的 HTML 网页设计代码
<!DOCTYPE html>
<html>
<head>
<title>我的网页</title>
</head>
<body>
<h1>欢迎来到我的网页</h1>
<p>这是一个简单的 HTML 网页设计。</p>
<img src=\”https://picsum.photos/200\” alt=\”随机图片\”>
<ul>
<li>项目 1</li>
<li>项目 2</li>
<li>项目 3</li>
</ul>
</body>
</html>
在这个例子中,我们创建了一个简单的 HTML 网页,其中包括以下元素:
- <!DOCTYPE html>:告诉浏览器这是一个 HTML5 文件。
- <html>:定义 HTML 文档的根元素。
- <head>:包含有关文档的元数据,如标题等。
- <title>:定义网页标题,将显示在浏览器标签页上。
- <body>:定义网页的主要内容。
- <h1>:定义一个一级标题。
- <p>:定义一个段落。
- <img>:定义一个图片,并指定图片的源和替代文本。
- <ul> 和 <li>:定义一个无序列表,并列出项目。
程序员必知的8个Java开源IDE工具!你最钟意哪个?
出色的Java工具有助于提高工作效率。Java IDE 工具提供了多种用户独特需求和个人偏好来创建编程环境的方法。
今天,给大家分享8个程序员最爱的Java开源IDE工具,
没有用过的小伙伴,快快收藏哦!
01 BlueJ
BlueJJava环境下的一个内置编辑器、编译器、虚拟机、调试器的多应用软件,是专为教学设计的,很适合在小规模的软件开发中使用。它易于使用和测试的交互式界面,不仅适合用于在学校教授Java编程课程,而且允许程序员调用功能,即对象、方法、参数等,而无需编译源代码。
02 Eclipse
Eclipse是一款主要用Java编写的免费IDE,允许创建各种跨平台的可用于手机、网络、桌面和企业领域的Java应用程序。
它的主要功能包括Windows生成器、集成Maven、Mylyn、XML编辑器、Git客户端、CVS客户端、PyDev,并且还有一个基本工作区,有可扩展插件系统可满足自定义IDE的需求。通过插件,也可以用C、C ++、JavaScript、Perl、PHP、Prolog、Python、R、Ruby(包括Ruby on Rails框架)等语言开发程序。
03 IntelliJ IDEA
IntelliJ IDEA CE(社区版)是IntelliJ IDEA的开源版本,为Java、Groovy、Kotlin、Rust和Scala等提供IDE。可用于现有的源重构,代码检查,使用JUnit或TestNG构建测试用例,以及使用Maven或Ant构建代码。IntelliJ IDEA CE的优秀功能有API测试仪,允许通过Swing GUI设计器测试API的功能,很多经验丰富的程序员尤其喜欢IntelliJ IDEA CE。
04 Netbeans IDE
NetBeans IDE是一个集成的Java开发环境,它能为独立的、移动的和web架构设计模块化的应用程序,并支持web技术。NetBeans IDE能建立关于如何有效管理项目、工具和数据的多个视图,并可以在新开发人员加入项目时进行软件开发协作。
05 VSCodium
VSCodium是一个免费的源代码编辑器,它在Windows、macOS、Linux上皆可用。它是一个基于Visual Studio代码的开源替代品,支持多种编程语言,如Java、c++、c#、PHP、Go、Python、.net等。
06 jEdit
jEdit是一个具有广泛插件架构的文本编辑器,具备编辑搜索,查找,替换和源代码编辑等功能,支持超过两百种语言,包括Unicode。
07 jGRASP
jGRASP是运行在Java平台上的IDE,提供可视化自动生成,能在运行时产生静态可视化的源代码结构和直观化的数据结构,且jGRASP能产生支持Java、C、C ++、Objective-C、Python、Ada和VHDL的控制结构图;支持Java和Ada的复杂文件图表;支持Java的UML类图;还有动态对象查看器和结合了集成调试器和Java工作台的画布查看器。
08 JSource
JSource是免费的Java IDE,尤其在创建跨平台的Java应用程序中非常有用。JSource能运行、编译、编辑和创建Java文件,主要特点是支持多种语言的语法高亮显示和Java Swing组件。
程序员最爱的8个Java开源IDE工具你收藏了吗?如果还有什么想要了解的,或者你有其他更好用的IDE,欢迎大家在下方留言探讨!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。