Python Falcon 简明教程

Python Falcon - WSGI vs ASGI

Web Server Gateway Interface(WSGI)

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

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

  1. environ − 一个 Python dict 对象,它类似于 CGI 环境变量和某些特定的 WSGI 变量。

  2. 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 函数称 coroutine 为,因此不能像普通函数一样运行。取而代之的是,我们需要使用 asyncio.run (coroutine) 调用它。可以通过 await 关键字使协程的执行暂停,直到另一个协程完成。

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

asyncio.run(main())

Asynchronous Server Gateway Interface(ASGI)

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

ASGI 应用程序是一个异步可调用对象(用户定义的函数或具有 call() 方法的类的对象)。它获取三个参数,如下所示:

  1. Scopedict 包含特定连接的详细信息

  2. Send − 一个异步可调用对象,可通过它将事件消息发送给客户端

  3. 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!',
})