Python Falcon - WSGI vs ASGI



Web 服务器网关接口(WSGI)

一些最流行的 Python Web 框架实现了 WSGI(代表 **Web Server Gateway Interface**)。WSGI 本质上是一套关于 Web 服务器和 Web 应用程序之间通用接口的规范,由 Web 服务器软件实现,用于处理来自基于 Python 的 Web 应用程序的请求。WSGI 规范于 2003 年首次引入 (PEP 333),并在 2010 年进行了更新 (PEP 3333)。

服务器通过传递以下参数来调用 WSGI 应用程序对象:

  • **environ** - 一个 Python **dict** 对象,类似于 CGI 环境变量和一些 WSGI 特定的变量。

  • **start_response** - 一个回调函数,应用程序可以使用它来返回其响应以及标头和状态码。

此对象可以是 Python 中任何可调用的对象,例如函数、方法、类或具有 **__call__()** 方法的实例。此应用程序对象必须返回一个由单个字节字符串组成的迭代器。

def application (environ, start_response):
   ...
   ...
   return [("Hello World!".encode("utf-8")]

但是,启用 WSGI 的服务器在操作上是同步的,因此应用程序效率不高。Python 通过在标准库中引入 **asyncio** 模块,从 3.4 版本开始支持异步编程。

**asyncio** 模块提供了在 Python 应用程序中整合并发编程风格的能力(通常称为协作式多任务)。在这种方法中,操作系统不会阻塞不同进程之间的上下文切换。相反,一个进程会定期让出以适应其他进程,以便许多应用程序可以同时运行。

在 Python 3.5 版本中,添加了 **async** 和 **await** 这两个关键字。使用 async 关键字定义的 Python 函数成为 **协程**,因此不能像普通函数一样运行。相反,我们需要使用 **asyncio.run (coroutine)** 调用它。可以使用 await 关键字使协程的执行暂停,直到另一个协程完成。

import asyncio
async def main():
   print('hello')
   await asyncio.sleep(5)
   print('world')

asyncio.run(main())

异步服务器网关接口(ASGI)

ASGI 代表 **Asynchronous Server Gateway Interface**(根据其官方文档,它是 WSGI 的精神继任者),它为 Python Web 服务器、应用程序和框架添加了异步功能。

ASGI 应用程序是一个异步可调用对象(用户定义的函数或具有 **__call__()** 方法的类的对象)。它接受以下三个参数:

  • **Scope** - 包含特定连接详细信息的 **dict**

  • **Send** - 一个异步可调用对象,应用程序可以使用它向客户端发送事件消息。

  • **Receive** - 另一个异步可调用对象。应用程序可以使用它从客户端接收事件消息。

以下是异步函数表示的简单 ASGI 应用程序的原型:

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, world!',
})
广告