首页 > 其他分享 >5分钟弄懂WSGI和ASGI

5分钟弄懂WSGI和ASGI

时间:2024-06-12 12:30:55浏览次数:19  
标签:__ Web WSGI 异步 ASGI app 弄懂

WSGI 和 ASGI 的区别

在现代Web开发中,理解和选择合适的Web服务器网关接口(Web Server Gateway Interface, WSGI)和异步服务器网关接口(Asynchronous Server Gateway Interface, ASGI)非常重要。它们分别用于同步和异步的Web应用开发。本文将介绍WSGI和ASGI的基本概念,并通过代码示例展示它们的主要区别。

什么是WSGI?

WSGI 是一个用于Python Web应用程序和Web服务器之间的简单调用约定。它是Python标准库的一部分,由PEP 3333定义。WSGI的主要特点是同步和阻塞,它适用于处理同步的HTTP请求。

WSGI示例
# wsgi_app.py
def simple_app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/plain')]
    start_response(status, headers)

    return [b"Hello, WSGI World!"]

if __name__ == "__main__":
    from wsgiref.simple_server import make_server
    server = make_server('localhost', 8051, simple_app)
    print("Serving on port 8051...")
    server.serve_forever()

在这个示例中,simple_app是一个符合WSGI规范的应用程序,它接收两个参数:environ(一个包含请求信息的字典)和start_response(一个回调函数,用于开始响应)。这个应用程序在本地服务器上运行,并返回一个简单的“Hello, WSGI World!”消息。

什么是ASGI?

ASGI 是一个用于Python异步Web服务器和应用程序之间的标准接口。它由Django Channels项目引入,旨在支持WebSocket、HTTP2等协议。ASGI的主要特点是异步非阻塞,它能够更好地处理并发请求。

ASGI示例
# asgi_app.py
import asyncio

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [(b'content-type', b'text/plain')],
    })
    
    await send({
        'type': 'http.response.body',
        'body': b'Hello, ASGI World!',
    })

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("asgi_app:app", host="127.0.0.1", port=8000, log_level="info")

在这个示例中,app是一个符合ASGI规范的应用程序,它接收三个参数:scope(一个包含请求范围信息的字典)、receive(一个异步接收函数)和send(一个异步发送函数)。这个应用程序使用uvicorn服务器运行,并返回一个简单的“Hello, ASGI World!”消息。

WSGI 和 ASGI 的主要区别

  1. 同步 vs 异步:WSGI是同步的,每个请求必须等待前一个请求完成。而ASGI是异步的,可以同时处理多个请求。

  2. 扩展性:WSGI主要用于HTTP协议,不支持WebSocket等其他协议。而ASGI支持HTTP、WebSocket等多种协议,适用于实时通信应用。

  3. 性能:在高并发场景下,ASGI通常比WSGI性能更好,因为它可以并行处理请求,而WSGI在处理大量请求时可能会成为瓶颈。

  4. 复杂度:WSGI相对简单,适合处理传统的Web应用。而ASGI由于其异步特性,代码编写和调试会更加复杂。

结论

WSGI和ASGI各有优劣,选择它们取决于应用的具体需求。如果你正在开发一个传统的、以HTTP为主的Web应用,WSGI是一个不错的选择。它简单且已经被广泛采用。如果你需要处理高并发、实时通信或WebSocket,ASGI将是更好的选择。

希望这篇文章能够帮助你理解WSGI和ASGI的主要区别,并在实际开发中做出更明智的选择。

标签:__,Web,WSGI,异步,ASGI,app,弄懂
From: https://blog.csdn.net/jiangnanjunxiu/article/details/139577222

相关文章

  • Django + Vue 使用Nginx + uWsgi部署
    1.settings.py配置STATIC_ROOT=os.path.join(BASE_DIR,'static/dist')#导入前后端静态资源后更改即可DEBUG=True#为True不容易暴露项目信息,当然也不显示BUG信息ALLOWED_HOSTS=['*']STATIC_URL='/static/' 2.django端打包静态资源#会在static下生成[root@dsc1m......
  • 透过 node-exporter 彻底弄懂机器监控:01. node-exporter 框架讲解
    前言Prometheus生态里有很多采集器负责各类监控数据的采集,其中使用最广泛的,显然是node-exporter,负责Linux、BSD等系统的常规监控指标的采集,比如CPU、内存、硬盘、网络、IO等。其github地址是:https://github.com/prometheus/node_exporter 。很多人都用过,但对其细节未必......
  • uwsgi+nginx启动Django静态文件设置
    总体思路:设置好STATIC_ROOT后使用pythonmanager.pycollectstatic命令将django下所有的静态文件搜集到STATIC_ROOT下,然后让nginx的static路由指向这个目录1.Django的settings.py文件中设置如下STATIC_URL='/static/'STATIC_ROOT=os.path.join(BASE_DIR,'staticfiles'......
  • CentOS+Django+uWSGI+Celery+Supervisor配置
    目录背景目录安装配置Supervisor1.生成配置文件2.修改配置文件3.创建进程文件创建uwsgi.conf进程文件创建celery进程文件启动supervisor启动supervisor查看所有进程的状态常用命令配置文件详解背景使用Django开发的项目需要部署到CentOS中,项目中使用了Celery和uWSGI......
  • Flask 生产环境部署(Falsk + uWSGI + nginx)
    前言最近自己做了个Falsk小项目,在部署上服务器的时候,发现虽然不乏相关教程,但大多都是将自己项目代码复制出来,不讲核心逻辑,不太简洁,于是将自己部署的经验写成内容分享出来。uWSGI简介uWSGI:一种实现了多种协议(包括uwsgi、http)并能提供服务器搭建功能的Python包Differenc......
  • python+uwsgi警告
     1.出现这个警告是python没有安装uwsgi !!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!! norequestpluginisloaded,youwillnotbeabletomanagerequests. youmayneedtoinstallthepackageforyourlanguageofchoice,orsimplyloaditwith--plugin. !!......
  • django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug
    django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug Python来说,它有很多web框架,常见的有jango、Flask、Tornado、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGIServer一般为Gunicorn,它是一个比较出名的We......
  • 【服务器uwsgi + flask + nginx的搭建】
    目录服务器uwsgi+flask+nginx的搭建1.安装必要的软件2.启动nginx服务3.测试Nginx4.配置uwsgi和flask5.配置nginx服务器uwsgi+flask+nginx的搭建1.安装必要的软件安装Python、uWSGI、Flask和Nginx。#Ubuntu安装命令sudoapt-getupdatesudoap......
  • 一文搞懂 CGI, FastCGI, WSGI, uWSGI, uwsgi
    CGI:CommonGatewayInterfaceWSGI:WebServerGatewayInterface 图解注意: django项目是跑在uWSGIweb服务器上的 问题:有uWGSI了,Django为什么还需要Nginx?一个普通的个人网站,访问量不大的话,当然可以由uWSGI和Django构成。但是一旦访问量过大,客户端请求连......
  • Django+nginx+uwsgi +apscheduler任务重复执行问题
    Django+nginx+uwsgi+apscheduler任务重复执行问题1、问题描述通过Django+nginx+uwsgi部署项目,前端页面通过API接口动态添加、管理apscheduler定时任务。由于uwsgi启动多个worker,导致每个worker执行一次定时任务,导致任务的重复执行。如下图,因为uwsgi.ini文件......