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版本中,这两个关键字 async 和 await 被添加进来。一个用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!',
})