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

news2024/11/15 21:09:13

在当今的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_server

def 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 asyncio

channel_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.coloradmin.cn/o/1181584.html

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

相关文章

中国人民大学与加拿大女王大学金融硕士——在职读研,让人生的火花迸发

每个人都像是一块未经雕琢的宝石,隐藏着无尽的光芒。然而,生活、工作中的困难、挫折和压力,就像尘土一样,掩盖了我们的闪亮之处。只有当我们冲破这些阻碍,才能让内在的光芒照亮世界。中国人民大学与加拿大女王大学金融…

Q-Vision+CANpro Max总线解决方案

智能联网技术在国内的发展势头迅猛,随着汽车智能化、网联化发展大潮的到来,智能网联汽车逐步成为汽车发展的主要趋势。越来越多整车厂诉求,希望可以提供本土的测量软件,特别是关于ADAS测试。而风丘科技推出的Q-Vision软件不仅可支…

一键批量剪辑:视频随机分割新玩法,高效剪辑不再难

随着视频内容的日益丰富,人们对于视频剪辑的需求也日益增长。而传统的视频剪辑方式往往需要耗费大量的时间和精力,让许多非专业人士望而却步。然而,现在有一款名为“云炫AI智剪”的软件,它为我们提供了一种全新的视频剪辑方式——…

数据结构:AVL树的旋转(平衡搜索二叉树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们…

uniapp原生插件之安卓串口操作原生插件

插件介绍 安卓串口操作原生插件,支持设置串口,波特率,停止位,数据位,校验位,流控以及延迟,支持粘包处理解决分包问题,支持多串口操作,无需root 插件地址 安卓串口操作…

2023年【危险化学品经营单位安全管理人员】考试资料及危险化学品经营单位安全管理人员考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位安全管理人员考试资料为正在备考危险化学品经营单位安全管理人员操作证的学员准备的理论考试专题,每个月更新的危险化学品经营单位安全管理人员考试试卷祝您顺利通过危险化学品经…

【深度神经网络(DNN)】实现车牌识别

文章目录 前言一、数据集介绍二、步骤1.导包2.参数配置3.数据处理4.模型定义5.模型训练6.模型预测 总结 前言 课内实践作业 车牌识别 一、数据集介绍 1.车牌识别数据集:VehicleLicense车牌识别数据集包含16151张单字符数据,所有的单字符均为严格切割且…

力扣:67.二进制求和

class Solution { public:string addBinary(string a, string b) {string ans;reverse(a.begin(), a.end()); // 将字符串a反转reverse(b.begin(), b.end()); // 将字符串b反转int n max(a.size(), b.size()), carry 0; // 获取a和b的最大长度,并初始化进位为0for…

Python合并拼接图片

目录 图片二维合并拼接(类似九宫格)图片纵向合并拼接举例18张图片合并为2张九宫格图片18张图片合并为2张纵向图片 使用前需要安装PIL库,以下代码使用的Pillow(10.1.0) pip install pillow图片二维合并拼接(类似九宫格&#xff09…

趣玩行为商城:用智能消费行为开启财富新生活!

随着当前的消费主力转移至90后和Z时代,购物和消费习惯已经发生了翻天覆地的变化。以往那种大超市,线下大卖场、超级Mall综合体逐渐式微,以“健康生活”、“智能消费”“社区直达”为主的消费理念逐渐兴盛,消费者开始更多地关注此类…

sqli-labs-1

文章目录 Less-01Less-02Less-03Less-04 Less-01 1.输入不同的id值,可以获取不同的用户信息: 2.在sql后拼接’or11–,并没有获取到所有用户的信息,猜测可能用了limit语句 3.构造错误的sql语句,果然有limit报错: …

简历考察点1_《基于 VUE2.0 前后端分离的个人博客系统》

项目名称:《基于 Vue2.0①前后端分离的个人博客系统》 项目描述:提供最新技术资讯、开发知识和分享的博客平台,功能模块包括:支持不同用户登录注册、编辑并发布博客、上传图片、评论留言、根据访问量查询最热文章和标签、根据日期…

VM虚拟机逆向---[羊城杯 2021]Babyvm 复现【详解】

文章目录 前言题目分析汇编脚本分析汇编exp 后言 前言 无 题目分析 &unk_804B0C0里面是opcode,sub_1C8里面有个mprotect,用了一个SMC加密。 我使用的是动态调试,因为是ELF文件,链接一下linux,进行动调&#xff…

Android11修改连接WiFi后AP端显示的设备名

修改build.prop文件 1.修改 /system/build.prop 最后添加,xxx 为自己设置的设备名: net.hostnamexxx 2. 重启、重连wifi,从热点或路由器后台查看设备名即为修改后的名称 代码里动态配置 暴力手段:grep -rn “net.hostname” *…

matlab中的iddata函数的初步理解和使用程序举例

matlab中的iddata函数的初步理解和程序举例 一、iddata函数功能 iddata函数常用于系统识别分析领域数据分析方面。该函数在时域或频域中,将用于系统识别的输入输出数据及其特性数据的生成对象数据类型。即,可以使用iddata函数封装要标识的系统的输入和…

【Transformer从零开始代码实现】(一)输入部件:embedding+positionalEncoding

Transformer总架构图 输入相关组件 输入部分: 源文本嵌入层位置编码器目标文本嵌入层位置编码器 (1)Embedding 首先,需要对输入的内容进行向量化。 1)先导示例 nn.Embedding示例: # 10代表嵌入的数…

即插即用篇 | YOLOv8 引入反向残差注意力模块 iRMB | 《ICCV 2023 最新论文》

论文地址:https://arxiv.org/abs/2301.01146 代码地址:https://github.com/zhangzjn/EMO 本论文着重于开发现代、高效、轻量级的模型,用于进行密集预测,同时在参数、FLOPs和性能之间进行权衡。倒置残差块(IRB)作为轻量级CNN的基础设施,但在基于注意力的研究中尚未找到对…

目标检测中的评价指标

目标检测中的评价指标 将检测目标分为正样本和负样本。 真阳性(true positives , TP) : 正样本被正确识别为正样本。 假阳性(false positives, FP): 负样本被错误识别为正样本。 假阴性(false negatives, FN&#…

技术分享 | app自动化测试(Android)-- 参数化用例

参数化是自动化测试的一种常用技巧,可以将测试代码中的某些输入使用参数来代替。以百度搜索功能为例,每次测试搜索场景,都需要测试不同的搜索内容,在这个过程里面,除了数据在变化,测试步骤都是重复的&#…

Java附件和base64相互转换

1 文件转base64 声明:我用的是Hutool的Base64下的api package cn.hutool.core.codec; 首先找一张图片 很简单,直接使用Base64的encode方法就可以拿到文件的base64码: File file new File("D:\\Tools\\Images\\北极熊.jpg");String…