返回顶部
首页 > 资讯 > 后端开发 > Python >Python异步编程|ASGI 与 Django(附源码)
  • 938
分享到

Python异步编程|ASGI 与 Django(附源码)

django服务器python原力计划 2023-08-31 15:08:55 938人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

异步服务网关接口(Asynchronous Server Gateway Interface,ASGI)秉承WSGI统一网关接口原则,在异步服务、框架和应用之间提供一个标准接口,同时兼容WSGI。 01、ASGI ASGI是根据统一接口

图片

异步服务网关接口(Asynchronous Server Gateway Interface,ASGI)秉承WSGI统一网关接口原则,在异步服务、框架和应用之间提供一个标准接口,同时兼容WSGI。

01、ASGI

ASGI是根据统一接口的思想重新设计的新标准,你可能会有疑问,为什么不直接升级WSGI而去创造新的标准呢?

WSGI是基于Http短连接的网关接口,一次调用请求必须尽快处理完毕并返回结果,这种模式并不适用于长连接,例如html 5新标准中的技术SSE(Server-Sent Events)和websocket,WSGI及传统阻塞型io 编程模型并不擅长处理这类请求。就算强行升级WSGI以支持异步IO,可是如果配套的技术(如Apache服务器)没有提供相应的支持也是没有意义的。既然python异步IO 编程模型已经走在了前面,那就制定一个全新的标准ASGI以最优雅的方式支持并使用最新的技术。

ASGI接口是一个异步函数,它要求传入3个参数,分别为 scope、receive和send,示例代码如下:

async def app(scope, receive, send):    pass

其中scope是一个字典(dict),包括连接相关的信息,图1所示是一个请求中的scope所包括信息的断点调试截图。

receive是一个异步函数,用于读取前端发来的信息,一条读取到的信息结构如下:

{    'type':'http.request',    'body':b"",    'more_body':False}

该信息中包括3个字段,分别为类型(type)、内容(body)和是否还有更多内容(more_body),其中通过type 可以用来判断该信息是什么类型,如HTTP 请求、生命周期、WEBSocket请求等,body是该信息中包括的数据,此数据采用二进制格式,more_body指明当前数据是否已经发送完毕,如果发送完毕,则more_body的值为False,这样便可以用来分段传输大文件。

图片

■ 图1  断点截图

 send也是一个异步函数,用于向前端发送信息,所发送的信息结构与从前端接收的信息结构类似。一个向前端发送简单信息的示例代码如下:

async def app(scope, receive, send):#向前端发送HTTP协议头,包括了HTTP状态与协议头    await send({        'type':'http.response.start',        'status':200,        'headers':[            [b'content-type', b'text/html'],        ]  })#向前端发送数据,如果数据庞大,还可以分段发送    await send({        'type':'http.response.body',        'body':b"Hello World",        'more_body':False    })

除了常规数据通信外,ASGI 还规定了生命周期管理接口,可以用于侦听服务器的启动与关闭。在实际开发工作中,这非常有用,可以用来执行初始化工作与收尾工作,生命周期管理的运用代码如下:

async def app(scope, receive, send):    request_type = scope['type']    if request_type == 'lifespan':        while True:            message = await receive()            if message['type'] == 'lifespan.startup':                await send({'type':'lifespan.startup.complete'})            elif message['type'] == 'lifespan.shutdown':                await send({'type':'lifespan.shutdown.complete'})                break

当scpoe['type']的类型是lifespan时,意味着该请求的类型是生命周期,该请求会在服务器启动之初发生,接下来应该实现对生命周期的管理。

通过无限循环不断侦听请求状态的变化,当读到message[t' ype']是lifespan.startup时执行初始化操作,在操作完成后向前端(协议层)发送lifespan.startup.complete信息,协议层可理解为服务器已经启动完成,可以正常接受浏览器请求了。

当读到message['type']是lifespan.shutdown时,意味服务要关闭,可能是由于服务器管理员执行了关闭指令,那么在这里就需要执行收尾工作,例如释放相应资源等。在收尾完成后向协议层发送lifespan.shutdown.complete信息,表明此时协议层可以放心地关闭服务器。

一个完整的基于ASGI的 Hello World 示例代码如下:

async def app(scope, receive, send):    request_type = scope['type']    if request_type == 'http':        await send({            'type':'http.response.start',            'status':200,            'headers':[                [b'content-type', b'text/html'],            ]        })        await send({            'type':'http.response.body',            'body':b"Hello World",            'more_body':False        })    elif request_type == 'lifespan':        while True:            message = await receive()            if message['type'] == 'lifespan.startup':                await send({'type':'lifespan.startup.complete'})            elif message['type'] == 'lifespan.shutdown':                await send({'type':'lifespan.shutdown.complete'})                break    else:        raise NotImplementedError()

02、Uvicorn

Uvicorn是ASGI的一个协议层实现,一个轻量级的ASGI服务器,基于uvloop 和httptools实现,运行速度极快。

uvloop是一个高效的基于异步IO 的事件循环框架,底层实现由libuv承载。libuv是一个使用C语言开发的支持高并发的异步IO 库,由node.js的作者开发,作为node.js的底层IO 库实现,如今已经发展得相当成熟稳定。

要使用Uvicorn需要先通过命令pip install uvicorn安装该依赖项,项目结构如图2所示。

接下来在终端输入uvicorn asgi:app以启动该服务器,效果如图3所示

图片

■ 图2  ASGI项目文件结构

 

图片

 ■ 图3  启动ASGI服务器

服务器启动后,可使用浏览器通过http://127.0.0.1:8000访问该站点,结果如图4所示。

为了向用户提供更加安全的服务,现代网站都需要支持https,Uvicorn 也提供了对HTTPS的支持,使用起来也相当方便。

首先准备好HTTPS证书文件,如图5所示。

图片

■图4  页面访问结果

图片

 ■ 图5 证书文件所在目录

接下来通过命令uvicorn--ssl-certfile ./ssl/cert.pem--ssl-keyfile ./ssl/cert.key asgi:app来启动该服务器,如图6所示。

图片

■ 图6  以HTTPS方式启动服务器

容器化对应的 Dockerfile 文件内容如下:

FROM Python:3-slimRUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uvicorn

容器化对应的docker-compose.yml内容如下:

services:  web:    build:.    restart:always    tty:true    ports:      - "8000:8000"    volumes:      - ".:/opt/"    working_dir:"/opt/"    command:uvicorn --host 0.0.0.0 asgi:app

 03、源码

 

来源地址:https://blog.csdn.net/qq_41640218/article/details/132014936

--结束END--

本文标题: Python异步编程|ASGI 与 Django(附源码)

本文链接: https://lsjlt.com/news/386117.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python异步编程|ASGI 与 Django(附源码)
    异步服务网关接口(Asynchronous Server Gateway Interface,ASGI)秉承WSGI统一网关接口原则,在异步服务、框架和应用之间提供一个标准接口,同时兼容WSGI。 01、ASGI ASGI是根据统一接口...
    99+
    2023-08-31
    django 服务器 python 原力计划
  • python异步的ASGI与Fast Api实现
    目录ASGI框架ASGI服务器FastAPI总结Asgi是异步通信服务规范。客户端发起服务呼叫,但不等待结果。调用方立即继续其工作,并不关心结果。如果调用方对结果感兴趣,有一些机制可以让其随时被回调方法返回结果。 ...
    99+
    2022-06-02
    python ASGI与Fast Api python异步ASGI python异步Fast Api
  • python异步的ASGI与Fast Api的实现方法
    这篇文章主要介绍“python异步的ASGI与Fast Api的实现方法”,在日常操作中,相信很多人在python异步的ASGI与Fast Api的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pyt...
    99+
    2023-06-20
  • Java与Django:谁更适合异步编程?
    Java和Django都是常见的编程语言,它们都支持异步编程,但是到底哪一个更适合异步编程呢?这是一个经常被讨论的话题。 Java作为一种成熟的编程语言,已经有了很多成熟的异步编程框架,比如Netty、Vert.x等。而Django则是一种...
    99+
    2023-10-08
    django spring 异步编程
  • fastapi与django异步的并发源码对比分析
    这篇文章主要介绍“fastapi与django异步的并发源码对比分析”,在日常操作中,相信很多人在fastapi与django异步的并发源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”fastapi...
    99+
    2023-07-05
  • Laravel和JavaScript的异步编程与Python的异步编程有何不同?
    随着计算机技术的不断发展,异步编程已经成为了现代编程中的一个非常重要的概念。许多编程语言都提供了异步编程的支持,如Laravel、JavaScript和Python等。虽然它们都可以实现异步编程,但是它们之间的实现方式有所不同。本文将探讨...
    99+
    2023-09-08
    异步编程 laravel javascript
  • Python异步编程: 揭秘异步编程的本质, 优化代码性能
    异步编程,英文Asynchronous Programming,是指程序中的某些任务可以并发地执行,而无需等待其他任务完成,从而提高程序的整体运行效率。在Python中,asyncio模块是实现异步编程的主要工具,它提供了协程、事件循环...
    99+
    2024-02-25
    Python 异步编程 协程 事件循环 高并发 低延迟 非阻塞I/O。
  • Python异步编程: 揭开异步编程的神秘面纱, 提升代码效率
    异步编程简介 异步编程是一种编程范式,它允许程序在等待I/O操作(如网络请求、数据库查询等)时执行其他任务,而不会阻塞整个程序。传统上,程序员都是使用同步编程来处理I/O操作,这意味着程序在等待I/O操作完成时会阻塞。这可能会导致程序的...
    99+
    2024-02-25
    Python 异步编程 非阻塞I/O 高并发 提升效率
  • Python异步编程Async/Awai
    python 从3.5开始从语言层面提供了新的异步编程语法。 import asyncio async def hello(): print("hello the world") r = await asyncio....
    99+
    2023-01-31
    Python Async Awai
  • JS中的async与await异步编程及await使用陷阱源码分析
    这篇“JS中的async与await异步编程及await使用陷阱源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中...
    99+
    2023-07-05
  • Java异步编程中如何进行FutureTask源码分析
    本篇文章给大家分享的是有关Java异步编程中如何进行FutureTask源码分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的异步编程是一项非常常用的多线程技术。但之...
    99+
    2023-06-19
  • Python编程中框架与异步编程的密切关系。
    Python编程中框架与异步编程的密切关系 Python是一种高级编程语言,被广泛应用于各种领域,如Web开发、数据分析、人工智能等。Python编程中框架和异步编程是两个重要的概念,它们在Python编程中的应用非常广泛,本文将介绍它们之...
    99+
    2023-06-18
    编程算法 框架 异步编程
  • Bash与Python:哪种编程语言更适合异步编程?
    Bash与Python:哪种编程语言更适合异步编程? 在编程领域,异步编程是一项关键技术,它可以帮助程序员更高效地利用计算机资源,提高程序的性能和响应能力。而在选择编程语言时,Bash和Python都是非常流行的选择,那么哪种编程语言更适合...
    99+
    2023-09-20
    bash 异步编程 分布式
  • ASP和Django:异步编程的对比分析?
    ASP和Django:异步编程的对比分析 随着Web应用程序的不断发展,异步编程已经成为了构建高性能、高并发Web应用程序的必要技能。在这篇文章中,我们将比较ASP和Django这两个流行的Web框架在异步编程方面的优劣。 ASP(Acti...
    99+
    2023-09-29
    异步编程 django 缓存
  • 异步编程:ASP和Django哪个更优秀?
    异步编程已经成为了现代Web开发中的一个重要话题。在ASP和Django中,异步编程的实现方式有很多不同。本文将比较这两个框架在异步编程方面的优点和缺点,以及它们的异步编程实现方式。 ASP和Django都是流行的Web框架,它们都支持异步...
    99+
    2023-09-29
    异步编程 django 缓存
  • Python异步编程: 实现高效并发的异步代码之道
    1. 为什么要使用异步编程? 传统编程使用阻塞式I/O,这意味着程序会等待某个操作完成,然后才能继续执行。这对于处理单个任务来说可能很有效,但对于处理大量任务时,可能会导致程序变慢。 异步编程则打破了传统阻塞式I/O的限制,它使用非阻塞...
    99+
    2024-02-25
    Python 异步编程 协程 事件循环 asyncio
  • Python 异步编程:与 Unix 系统有何关系?
    在计算机科学领域,异步编程是一种非常常见的编程模式,它允许程序在执行某个操作时,同时执行其他操作,而不是等待当前操作完成。Python 语言自从 3.5 版本开始,就引入了异步编程的支持,这也让 Python 成为了一个非常流行的异步编程...
    99+
    2023-10-30
    异步编程 unix javascript
  • Laravel中的同步编程:与Python并发编程的异同点
    Laravel是一款流行的PHP框架,而Python也是一门广泛应用的编程语言。在编程语言中,同步编程和异步编程是两个重要的概念。在本文中,我们将探讨Laravel中的同步编程和Python中的异步编程之间的异同点。 同步编程是一种编程方式...
    99+
    2023-09-16
    并发 同步 laravel
  • 详解python之异步编程
    目录一、异步编程概述二、python的异步框架模型三、顺序执行多个可重叠的任务四、异步化同步代码五、使用多线程克服具体任务的异步限制总结一、异步编程概述 异步编程是一种并发编程的模式...
    99+
    2024-04-02
  • Python中的同步与异步编程,如何处理数组?
    随着互联网的飞速发展,计算机的性能越来越强大,人们的需求也越来越高。在这样的背景下,同步和异步编程逐渐成为了热门话题。同步和异步编程的本质区别在于程序的执行方式不同,同步是指程序在执行某个任务时,会一直等待任务完成后再执行下一个任务;而异...
    99+
    2023-09-08
    同步 数组 异步编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作