什么是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来解决

  1. 安装

    pip install gunicorn 
  2. 在项目文件下

    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,部署完成,就是这么简单