WSGI与ASGI:两种Python Web服务器网关接口的比较

在当今的Web开发领域,选择合适的服务器网关接口(Server Gateway Interface,简称SGI)对于提高Web应用程序的性能和并发性至关重要。在Python中,有两种常见的SGI:WSGIASGI。本文将深入探讨这两种SGI的异同点。 WSGI与ASGI

1、WSGI的概念

首先,让我们了解一下WSGI(Web Server Gateway Interface)。

WSGI 是一种同步的网关接口,它使用线程来处理每个请求,通过简单的函数调用——一个可调用的对象(通常是一个函数)来处理HTTP请求,并返回HTTP响应。这意味着在一个请求被处理期间,其他请求必须等待。这种同步处理方式在处理大量并发请求时可能会导致性能问题,因此WSGI适用于处理低并发、IO密集型的应用程序,在这种环境下,同步的请求处理足够高效。由于这种限制,WSGI的典型实现包括Gunicorn、uWSGI和mod_wsgi等。

2、ASGI的概念

随着异步编程概念的普及,出现了另一种网关接口——ASGI(Asynchronous Server Gateway Interface)。

ASGI 是一种异步的网关接口,允许同时处理多个请求。通过使用事件循环和协程,ASGI 可以实现高并发性能,从而更好地应对大量并发请求。ASGI 的典型实现包括DaphneUvicornHypercorn 等。

3、请求方式差异

通过上面的概念,我们了解到WSGI和ASGI在请求方面的差异,主要体现在同步和异步处理请求上。通过一个简单的例子来进一步理解WSGI和ASGI之间的区别。

假设我们有一个名为"my_web_app"Python Web应用程序,它需要连接到Web服务器并处理来自客户端的请求。我们可以使用WSGIASGI 来实现这个连接。

3.1、使用 WSGI 的例子:

from wsgiref.simple_server import make_serverdef application(environ, start_response):status = '200 OK'headers = [('Content-type', 'text/plain')]start_response(status, headers)return [b"Hello World"]httpd = make_server('', 8000, application)
print("Serving on port 8000...")
httpd.serve_forever()

在上面的例子中,我们使用 WSGI 的典型实现之一——make_server 函数来创建了一个简单的 Web 服务器。我们直接访问 localhost:8000, 可以看到浏览器显示 Hello World 字样。

这个函数接受三个参数:请求处理函数、服务器的地址和端口号。当客户端发送请求时,服务器将调用请求处理函数,并将请求的详细信息传递给它。请求处理函数可以返回一个响应,服务器将将其发送回客户端。

3.2、使用 ASGI 的例子

from asgiref.sync import async_to_sync
from daphne import Daphne
from http import HTTPStatus import HTTPStatus
from channels.layers import get_channel_layer
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import os
import sys
import asynciochannel_layer = get_channel_layer()
asgi_app = get_asgi_application()async def application(scope, receive, send):if scope['type'] == 'http':await asgi_app(scope, receive, send)elif scope['type'] == 'websocket':await async_to_sync(channel_layer)(scope, receive, send)else:raise Exception('Unknown scope type')

在上面的例子中,我们使用 ASGI 的典型实现之一——Daphne 来创建了一个异步的Web服务器。Daphne是一个ASGI服务器,它能够同时处理HTTP和WebSocket连接。在应用程序中,我们首先获取了一个channel layer对象和一个ASGI应用程序对象。然后,我们定义了一个异步的请求处理函数,它根据请求的类型选择使用ASGI应用程序或channel layer来处理请求。对于HTTP请求,我们直接调用ASGI应用程序;对于WebSocket请求,我们使用channel layer来处理。最后,我们将请求处理函数传递给Daphne服务器,让它来处理来自客户端的请求。

通过这个例子,我们可以看到WSGI和ASGI的主要区别在于它们处理请求的方式和性能。WSGI使用同步的方式处理请求,每个请求都需要在一个单独的线程中执行。而ASGI使用异步的方式处理请求,可以同时处理多个请求,并通过事件循环和协程实现高并发性能。因此,选择使用WSGI还是ASGI取决于你的应用程序的具体需求和性能要求。

上一篇文章:Python如何实现查看WiFi密码?

4、支持协议差异

除了处理请求的方式不同,WSGI和ASGI在支持的协议方面也存在差异。 WSGI是基于HTTP协议模式开发的,不支持WebSocket。这意味着使用WSGI的应用程序无法直接处理WebSocket连接,需要借助其他库或中间件来实现。

相比之下,ASGI不仅支持现有的Web开发中的一些新的协议标准,还支持原有模式和WebSocket的扩展。这使得使用ASGI的应用程序可以更灵活地适应不断变化的Web技术。 ASGI

5、总结

总之,WSGI和ASGI在处理请求、性能、支持的协议和典型实现等方面存在差异,选择哪种网关接口取决于具体情况。

如果你的应用程序需要处理高并发请求并且希望利用异步编程的优势,那么ASGI是一个更好的选择。然而,如果你的应用程序更关注与现有技术的兼容性并且不需要处理大量并发请求,那么WSGI可能是一个更合适的选择。

随着异步编程的日益普及和Web技术的不断发展,预期ASGI将在未来的Python Web开发中发挥越来越重要的作用。然而,WSGI作为传统的网关接口,仍将在许多现有的应用程序中发挥关键作用。 了解这两种SGI的优缺点有助于我们在构建和优化Web应用程序时做出明智的决策。

如果你觉得文章还不错,记得关注公众号: 锅外的大佬 锅外的大佬博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过51单片机控制SG90舵机按角度正反转转动

一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机,具有体积小、重量轻、结构简单等特点,被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机(STC89C52)作为控…

变压器试验VR虚拟仿真操作培训提升受训者技能水平

VR电气设备安装模拟仿真实训系统是一种利用虚拟现实技术来模拟电气设备安装过程的培训系统。它能够为学员提供一个真实、安全、高效的学习环境,帮助他们更好地掌握电气设备的安装技能。 华锐视点采用VR虚拟现实技术、MR混合现实技术、虚拟仿真技术、三维建模技术、人…

编辑器报警处理

1、warning CS8600: 将 null 文本或可能的 null 值转换为不可为 null 类型。 原代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned); 处理后的代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesR…

ubuntu22.04桌面版系统无法识别USB摄像头

虚拟机连接电脑摄像头连接失败(驱动程序错误) 本文为转载:版权归远作者所有,之所以转载是为了避免被原作者删除 巴黎铁塔下的女孩 你尽管努力,剩下的交给时间 虚拟机调用电脑的摄像头,正常情况下只需点击…

3.5、Linux:命令行git的使用

个人主页:Lei宝啊 愿所有美好如期而遇 在Linux Centos7.6下安装git yum -y install git 注册一个gitee账号 进去注册就好,记住自己的用户名和密码。 创建一个仓库 点击复制,接着就可以在Linux上使用了 git clone git clone 刚才复制的地…

优化改进YOLOv5算法之添加DCNv3模块,有效提升目标检测效果

目录 前言 1 DCNv3原理 1.1 DCNv2 1.2 DCNv3 1.3 模型架构 2 YOLOv5算法中加入DCNv3模块

el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示

效果&#xff1a; 代码&#xff1a; <span>系统词典维度&#xff1a;</span><el-selectv-model"dNum"placeholder"请选择"multiplecollapse-tags //设置collapse-tags属性将它们合并为一段文字size"small"style"width:160p…

Python模块导入出现ModuleNotFoundError: No module named ‘***’解决方法

概述 几年没弄python了&#xff0c;全部还会给老师&#xff0c;今天弄了个demo&#xff0c;老是报错&#xff0c;在此记录下&#xff0c;方便后续查阅。 环境&#xff1a;Windows10 开发IDEA&#xff1a;PyCharm 2023.1.3 1、报错如下所示 2、解决方法&#xff1a;安装execjs…

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…

虚幻引擎:C++网络属性同步

1. UPROPERTY(Replicated) FVector Color;//这一种没有通知,修改了值之后需要在tick中进行更新 UPROPERTY(ReplicatedUsing"OnRep_ChangeColor") FVector RanColor;//这一种有通知UFUNCTION()//有通知的同步需要绑定一个无返回值的函数 void OnRep_ChangeColor();//需…

技术干货 | GreatDB新一代读写分离架构,如何炼就近乎0损耗的性能?

优化数据库性能并降低成本是每位架构师和DBA都必须面对的挑战。其中&#xff0c;读写分离是一种常见方法&#xff1a;即通过将读操作和写操作分发到不同的数据库实例&#xff0c;实现多副本负载和性能提升。 传统的中间件方案&#xff0c;例如基于Proxysql、HAProxy、MySQL Ro…

学习笔记:CANOE模拟LIN主节点和实际从节点进行通信测试

先写点感想&#xff0c;在LIN开发阶段&#xff0c;我一般用图莫斯USB工具来进行模拟主机节点发送数据。后来公司买了CANOE工具就边学习边搭建了LIN的测试工程&#xff0c;网上的资料真的很少&#xff0c;主要是靠自己一点点摸索前进&#xff0c;总算入门。几个月后的今天&#…

计算机网络第4章-网络层(1)

引子 网络层能够被分解为两个相互作用的部分&#xff1a; 数据平面和控制平面。 网络层概述 路由器具有截断的协议栈&#xff0c;即没有网络层以上的部分。 如下图所示&#xff0c;是一个简单网络&#xff1a; 转发和路由选择&#xff1a;数据平面和控制平面 网络层的作用…

【C语言】【数据结构】【顺序表】

1.顺序表的销毁和初始化&#xff1a; 初始化&#xff1a; void SLInit(SeqList* ps) {ps->a NULL;ps->capacity 0;ps->size 0; }销毁&#xff1a; void SLDestroy(SeqList* ps) {if (ps->a)free(ps->a);ps->a NULL;ps->size ps->capacity 0; …

常用中间件分类

常见的中间件包括&#xff1a; 消息中间件&#xff1a;用于处理应用程序之间的异步消息传递&#xff0c;常见的消息中间件包括 RabbitMQ、Apache Kafka、ActiveMQ 等。 缓存中间件&#xff1a;用于缓存数据以加快访问速度&#xff0c;常见的缓存中间件包括 Redis、Memcached 等…

Python语言高级实战-内置函数super()的使用之类的单继承(附源码和实现效果)

实现功能 super()是一个内置函数&#xff0c;用于调用父类的方法。super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xff0c;但是如果使用多继承&#xff0c;会涉及到查找顺序&#xff08;MRO&#xff09;、重复调用&#xf…

[题] 改革春风吹满地 #图论 #多边形面积

题目 HDU 2036 改革春风吹满地 题解 参考博客&#xff1a;HDU 2036 改革春风吹满地 代码 #include<bits/stdc.h> using namespace std; const int N 110; //叉乘计算面积的公式&#xff0c;以(0,0)为起始点划分 int main() {int n;while(~scanf("%d", &…

gitlab数据备份和恢复

gitlab数据备份 sudo gitlab-rake gitlab:backup:create备份文件默认存放在/var/opt/gitlab/backups路径下&#xff0c; 生成1697101003_2023_10_12_12.0.3-ee_gitlab_backup.tar 文件 gitlab数据恢复 sudo gitlab-rake gitlab:backup:restore BACKUP1697101003_2023_10_12_…

SAP-MM-查找采购订单的创建和修改日期

在采购订单页面可以查看采购订单的修改和创建&#xff0c;但是有些内容不能完成看到 例如这个订单显示是用户唐创建&#xff0c;但是他不记得是什么时候创建的&#xff0c;怎么创建的&#xff1f; 点击菜单-环境-表头更改、项目更改&#xff0c;可以查看更改内容 通过这个表可…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …