什么是 Uvicorn ?
答:Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。 uvicorn是一个基于asyncio开发的一个轻量级高效的web服务器框架
uvicorn 设计的初衷是想要实现两个目标:
-
使用uvloop和httptools 实现一个极速的asyncio服务器
-
实现一个基于ASGI(异步服务器网关接口)的最小应用程序接口。
它目前支持http, websockets, Pub/Sub 广播,并且可以扩展到其他协议和消息类型。
官网:uvicorn
什么是 uvloop 和 httptools ?
答: uvloop 用于替换标准库 asyncio 中的事件循环,使用 Cython 实现,它非常快,可以使 asyncio 的速度提高 2-4 倍。asyncio 不用我介绍吧,写异步代码离不开它。
httptools 是 nodejs HTTP 解析器的 Python 实现。
什么是 ASGI 服务器?
答: 异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket。
请简单介绍下 Uvicorn
答:目前,Python 仍缺乏异步的网关协议接口,ASGI 的出现填补了这一空白,现在开始,我们能够使用共同的标准为所有的异步框架来实现一些工具,ASGI 帮助 Python 在 Web 框架上和 Node.JS 及 Golang 相竟争,目标是获得高性能的 IO 密集型任务,ASGI 支持 HTTP2 和 WebSockets,WSGI 是不支持的。
Uvicorn 目前支持 HTTP1.1 和 WebSocket,计划支持 HTTP2。
Uvicorn 使用方法
安装
# 安装
pip install uvicorn
新建一个example.py文件
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!',
})
命令行启动 uvicorn
uvicorn example:app
脚本形式启动
import uvicorn
async def app(scope, receive, send):
...
if __name__ == "__main__":
uvicorn.run("example:app", host="127.0.0.1", port=8000, log_level="info")
uvicorn 支持多个命令,可在 uvicorn --help 看到
Config和Server实例¶
要更好地控制配置和服务器生命周期,请使用uvicorn.Configand uvicorn.Server:
import uvicorn
async def app(scope, receive, send):
...
if __name__ == "__main__":
config = uvicorn.Config("main:app", port=5000, log_level="info")
server = uvicorn.Server(config)
server.run()
如果您想从已经运行的异步环境运行 Uvicorn,请改用uvicorn.Server.serve():
import asyncio
import uvicorn
async def app(scope, receive, send):
...
async def main():
config = uvicorn.Config("main:app", port=5000, log_level="info")
server = uvicorn.Server(config)
await server.serve()
if __name__ == "__main__":
asyncio.run(main())
使用 uvicorn 启动 FastAPI 项目
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == '__main__':
uvicorn.run(app=app)
FastAPI为什么使用uvicorn
FastAPI 是一个现代化的高性能 Web 框架,它使用 Python 的异步编程特性来提高 Web 应用程序的性能。而 Uvicorn 则是一个基于 uvloop 和 httptools 实现的高性能 ASGI 服务器,可以实现异步处理 HTTP 请求。FastAPI 使用 Uvicorn 作为其默认的 Web 服务器,是因为 Uvicorn 是一个非常快速、可靠且易于使用的 ASGI 服务器,可以在处理大量并发连接时保持稳定和高效。此外,Uvicorn 还支持 WebSocket 和 HTTP/2 等新特性,符合 FastAPI 提倡的现代 Web 开发理念。因此,使用 Uvicorn 作为 FastAPI 的 Web 服务器是一个很好的选择。