Sanic Document

这次我们来介绍一个 web 框架:Sanic,它既是一个 web 框架,同时也是一个 web 服务器。 关于框架,首先浮现在脑海中的就是 Flask、Django 之类的,但它们都是同步框架,而现在是一个高并发的时代,并发量是在构建服务时必须考量的一个指标。 所以我们自然就想到了 Python 中的异步框架,而提到异步框架,那么就必须要提 Sanic、FastAPI,这两个异步框架都很优秀,但是 Sanic 的表现要更加出色,使用 Sanic 构建的应用程序足以比肩 Nodejs。如果你再对 Sanic 在路由处理方面使用 C 语言做一些重构,那么并发性能可以和 Go 相媲美。

那么 Sanic 为什么这么快呢?肯定是有原因的,首先它是一个异步框架,使用了 Python 中的协程。 而提到协程必然少不了事件循环,而事件循环的构建依赖于 asyncio 这个库,但 asyncio 构建的事件循环效率是不高的,所以有一个第三方库 uvloop。 uvloop 使用 Cython 编写,基于 libuv,它可以让 asyncio 变得更快。 当然即便我们不开发 Sanic 服务,也可以使用 uvloop 来替换 asyncio 内部的事件循环。

import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

只需要以上几步,便可以让 asyncio.get_event_loop() 构建一个速度更快的事件循环。 但是有一点需要注意,uvloop 不支持 Windows 系统,但是这并不妨碍我们在 Windows 上开发 Sanic 服务, 因为内部虽然会导入 uvloop,但是做了一个异常捕获,所以导入失败话,会使用原生的 asyncio 事件循环。 因此即使你用 Windows,安装 Sanic 也没有问题,因为 uvloop 不会自动安装。但如果是在 Linux 上,uvloop 会自动帮我们安装。

此外在解析 json 的时候,使用的不是标准库中的 json,而是 ujson,ujson 解析数据也要比标准库的 json 快很多。 当然 ujson 也不会在安装 Sanic 的时候自动安装,也需要我们手动安装,但它是支持 Windows 平台的。

而在语法特性层面,Sanic 提供了和 Flask 类似的路由注册模式, 即可以通过装饰器的模式,而且 Sanic 内部也有 "蓝图" 这个概念,用于对业务进行逻辑分离。 如果你会 Flask 的话,那么很容易上手 Sanic,因为开发模式非常类似,当然不熟悉 Flask 也没有关系,因为 Sanic 本身和 Flask 一样简单。

下面我们来安装 Sanic,直接 pip install sanic 即可,安装之后我们就来学习如何使用 Sanic 框架编写我们的 web 服务。