Python Falcon - WSGI 与 ASGI

网络服务器网关接口(WSGI)

一些最流行的 Python 网络框架实现了 WSGI(代表 Web 服务器网关接口)。 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版本中,加入了asyncawait这两个关键字。 使用 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!',
})