Sanic、Fastapi 和 Fiber 简单压测对比
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sanic、Fastapi 和 Fiber 简单压测对比相关的知识,希望对你有一定的参考价值。
参考技术A Sanic:Fiber:
压测使用的程序是 go-stress-testing , 1000 个并发,每个并发进行 1000 次请求。
每栏对应的字段为:
Sanic:
Fiber:
可以看出来, sanic 和 fiber 差别不大, sanic 的性能几乎与 fiber 持平,可能是当下最高性能的 Python Web 框架,没有之一,即便是之前较为突出的异步框架 fastapi 也要落后于 sanic 。
附上 fastapi 的结果:
Flask 、 Django 等框架不在本文讨论范围之内,这二者本就不是为了高性能设计的框架,没有对比的意义。
sanic 还有一个优势,就是其没有开发服务器,用 sanic -w 8 main.app 运行的服务器就是生产服务器。
如果有想用 Python 开发 Web 服务器的,建议优先考虑 sanic ,但 fastapi 其实也够用了。
基于FastAPI和Docker的机器学习模型部署快速上手
针对前文所述 机器学习模型部署摘要 中docker+fastapi部署机器学习的一个完整示例
outline
- fastapi简单示例
- 基于文件内容检测的机器学习&fastapi
- 在docker容器部署
Install
pip install fastapi
pip install "uvicorn[standard]"
example
from typing import Optional
from fastapi import FastAPI
#创建FastAPI实例
app = FastAPI()
#创建访问路径
@app.get("/")
def read_root():#定义根目录方法
return "message": "Hello World"#返回响应信息
#定义方法,处理请求
@app.get("/items/item_id")
async def read_item(item_id: int):
return "item_id": item_id
在开发代码时,为了调试方便,可以使用如下命令
uvicorn main:app --reload
uvicorn main:app --reload 含义
- main:main.py 文件
- app:在
main.py
文件中通过app = FastAPI()
创建的对象。--reload
:让服务器在更新代码后重新启动。仅在开发时使用该选项。
upload file and predict
一个简单的上传文件并对文件进行检测的小样例
from typing import Optional
from sympy import content
import uvicorn
from fastapi import FastAPI,File,UploadFile
from io import BytesIO
from ml.predict import load_model,Features,predict
#创建FastAPI实例
app = FastAPI()
#创建访问路径
@app.get("/")
def read_root():
return "message": "Hello World"
# 加载模型
models = load_model()
def test(file):
feature = Features(file)
return model.predict(feature)
#调用模型接口
@app.post("/detect/v2")
async def detect2(file: UploadFile):
f = file.file
content = await file.read()
res = test(content)
return
"filename": file.filename,
"attributes": (len(content),str(type(f)),str(type(content))),
"result": res
#运行
if __name__ == \'__main__\':
uvicorn.run(app, host="127.0.0.1", port=8000)
test
在127.0.0.1:8000/docs
页面可以测试验证模型
request post
使用request构造post请求验证结果
import time
import requests
t0 = time.time()
url2 = \'http://127.0.0.1:8000/detect/v2\'
filename2 = "examples/00bb57e75b014b9342326afd2e7b7b071ee3f08205e56d0f1bfab8542509212a"
# requests库post请求文件格式
files =
\'file\':(filename2,open(filename2, \'rb\'))
response2 = requests.post(url2, files=files)
print(response2.content, f"\\n spend time: time.time()-t0")
deployment
install docker
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
官方文档 https://docs.docker.com/engine/install/ubuntu
创建Dockerfile
目录结构如下
.
├── app
│ ├── __init__.py
│ └── main.py #代码目录
├── Dockerfile
└── requirements.txt
构建Dockerfile
vim Dockerfile
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
build docker image
在Dockerfile所在目录执行
docker build -t myimage .
Start the Docker Container
docker run -d --name mycontainer -p 80:80 myimage
至此,基于docker的fastapi部署完成,可以在主机对应地址看到web信息,或发起对应http请求。
以上是关于Sanic、Fastapi 和 Fiber 简单压测对比的主要内容,如果未能解决你的问题,请参考以下文章