什么是wsgi
Wsgi是同步通信服务规范,客户端请求一项服务,并等待服务完成,只有当它收到服务的结果时,它才会继续工作。当然了,可以定义一个超时时间,如果服务在规定的时间内没有完成,则认为调用失败,调用方继续工作。

wsgi简单工作图
什么是asgi
Asgi是异步通信服务规范。客户端发起服务呼叫,但不等待结果。调用方立即继续其工作,并不关心结果。如果调用方对结果感兴趣,有一些机制可以让其随时被回调方法返回结果。

简单总结一下:Asgi是异步的,Wsgi是同步的,而基于Wsgi的Flask是同步框架,基于Asgi的FastAPI是异步框架,就这么简单。
正题
普及一下小知识,下面我们进入正题,什么是Uvicorn,Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。目前,Python 仍缺乏异步网关协议接口,ASGI 的出现填补了这一空白,现在开始,我们能够使用共同的标准为所有的异步框架来实现一些工具,ASGI 帮助 Python 在 Web 框架上和 Node.Js 及 Golang 相竞争,目标是获得高性能的 IO 密集型任务,ASGI 支持 HTTP2 和 WebSockets,WSGI 是不支持的。
进程管理器
使用进程管理器确保你以弹性方式运行运行多个进程,你可以执行服务器升级而不会丢弃客户端的请求。
一个进程管理器将会处理套接字设置,启动多个服务器进程,监控进程活动,监听进程重启、关闭等信号。
Uvicorn 提供一个轻量级的方法来运行多个工作进程,比如
--workers 4
,但并没有提供进行的监控。
Gunicorn 是成熟的,功能齐全的服务器,Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点,并且给你使用 Guicorn 来进行进程管理。
这样的话,你可能动态增加或减少进程数量,平滑地重启工作进程,或者升级服务器而无需停机。
在生产环境中,Guicorn 大概是最简单的方式来管理 Uvicorn 了,生产环境部署我推荐使用 Guicorn 和 Uvicorn
简单部署fastapi
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
app = FastAPI()
@app.get("/items/")
async def update_item(assetid:str):
print(assetid)
assetid = assetid.strip()
url = 'https://god_hearing.gitee.io/myhexo/?assetid=%s'%assetid
print(url)
return RedirectResponse(url=url)
if __name__ == '__main__':
import uvicorn
uvicorn.run(
app='transfer:app',
host='0.0.0.0',
port=8000,
workers=5,
debug=False
)
我们简单的写了一个接口,这里,我是使用了跳转重定向,可以直接return一个response
然后启动的这里,我们采用的是启动五个进程,并且关闭debug模式,不过我还没有发现这个debug关不关的区别在哪
这时候,我们直接运行即可。
但是,这样是阻塞式的,并且在关闭控制台之后就会停止,所以,我们使用gunicorn来解决
安装
pip install gunicorn
在项目文件下
gunicorn main:app -b 0.0.0.0:8000 -w 5 -k uvicorn.workers.UvicornH11Worker --daemon
然后,我们的项目就已经在运行了,然后访问一下你的域名+items/assetid=asfdg
关闭gunicron进程
# 查询
pstree -ap|grep gunicorn
结果为:

关闭进程
kill -9 15624
...
ok,部署完成,就是这么简单
- Post link: https://www.godhearing.cn/uvicorn-gunicorn-bu-shu/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.