Python Falcon WSGI vs ASGI

Python Falcon WSGI vs ASGI

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

一些最流行的Python网络框架实现了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从3.4版本开始支持异步编程,引入了 asyncio 模块作为标准库的一部分。

asyncio 模块提供了在Python应用程序中加入并发编程(通常称为合作多任务)的能力。在这种方法中,操作系统并不妨碍不同进程之间的上下文切换。相反,一个进程周期性地产生,以适应其他进程,从而使许多应用程序可以同时运行。

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

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

asyncio.run(main())

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

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

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

  • 范围 – 一个包含特定连接细节的 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!',
})

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程