python异步的ASGI与Fast Api实现

下面是关于“python异步的ASGI与Fast Api实现”的完整攻略,包括两条示例说明:

概述

在Python中,异步编程是一种非常流行的编程范式,以其高效性和低资源消耗而闻名。ASGI(异步服务器网关接口)是Python Web应用程序中使用的异步协议。FastAPI是一个基于ASGI的现代,快速(Fast)框架,可以让你使用Python 3.7+中最新的异步技术,设计和开发高性能的Web应用程序。在本文中,我们将介绍如何使用Python中的异步和ASGI来构建FastAPI应用程序,并提供两个示例以解释如何使用FastAPI实现异步编程。

步骤

以下是使用Python的FastAPI进行异步编程的步骤:

步骤1:安装FastAPI

在终端中输入以下命令安装FastAPI和uvicorn:

pip install fastapi uvicorn

步骤2:异步应用程序

为了让我们的应用程序支持异步,我们需要使用ASGI(异步服务器网关接口)。ASGI是一个Web服务器与Web应用程序之间的接口,该接口使Web应用程序更容易编写,更易于扩展,并且更加高效。以下是一个示例FastAPI应用程序:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

在上面的示例中,我们定义了一个FastAPI应用程序,然后使用一个异步函数装饰器@app.get('/')来定义一个GET路由处理器函数。在该路由处理器函数中,我们使用了异步关键字async以及await语句来等待异步调用的响应。

步骤3:运行FastAPI应用程序

以下步骤将启动FastAPI应用程序:

import uvicorn
if __name__ == "__main__":
    uvicorn.run(app, debug=True)

在上述示例中,我们按常规Python应用程序的方式定义了一个启动点,以便在“python main.py”中启动该应用程序。我们使用“uvicorn.run”函数启动FastAPI应用程序,并设置debug=True来开启调试模式。

步骤4:实现异步

以下是一个示例将异步运行和响应数据集成入FastAPI应用程序的方式。假设我们需要使用异步运行来获取一个URL的数据:

from fastapi import FastAPI, HTTPException
import aiohttp

app = FastAPI()

async def get_data_from_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status != 200:
                raise HTTPException(status_code=response.status, detail=response.text)
            return await response.json()

@app.get("/")
async def root():
    data = await get_data_from_url("https://jsonplaceholder.typicode.com/todos/1")
    return data

在上面的示例中,我们在应用程序中定义了一个异步函数get_data_from_url,它使用aiohttp来异步运行URL并返回结果。我们还使用了HTTPException来处理任何错误状态码。

在应用程序的路由处理器函数中,我们异步等待get_data_from_url函数的响应,然后将异步响应返回给客户端。

步骤5:运行FastAPI应用程序

同步应用程序与异步应用程序的主要区别是处理请求的方式。使用异步运行时,必须按照异步方式处理数据和响应。使用FastAPI时,可以使用uvicorn服务器运行异步应用程序。因此,按照以下步骤运行FastAPI应用程序:

import uvicorn

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

在上述示例中,我们按常规Python应用程序的方式定义了一个启动点,以便在“python main.py”中启动该应用程序。我们使用“uvicorn.run”函数启动FastAPI应用程序,并设置host="0.0.0.0"port=8000来指定应用程序的地址和端口。调试模式也可以设置为True。

示例1

在这个示例中,我们将实现一个异步的服务器端点,可以接收请求和响应,服务器的代码如下:

from fastapi import FastAPI
from typing import List
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

在上线文中,我们实现了四个不同的路由处理器函数,用于处理POST,GET,PUT请求并返回异步响应。我们使用Pydantic库定义了数据模型,用于存储与请求一起发送的数据。这样我们就可以使用item参数接收POST请求,并使用其参数来处理内容。使用GET请求和参数时,我们使用了路由上指定的参数来存储数据。在PUT请求中,我们使用“/items/{item_id}”路由来接收数据和更新相应的记录。

我们使用async关键字和await语句等待异步调用的响应。在启动应用程序时,使用以下命令启动:

$ uvicorn main:app --reload

在上述示例中,使用--reload参数启动Uvicorn应用程序时,可以在更改应用程序文件时重载文件。

示例2

在这个示例中,我们将创建一个异步的计算机视觉应用程序。计算机视觉应用程序可以处理图像并识别物体。在本例中,我们将使用DenseNet来识别图像中的对象。实现异步计算机视觉应用程序的代码如下:

import io
import numpy as np
import torch
from PIL import Image
from fastapi import FastAPI, UploadFile, File

app = FastAPI()


async def get_model():
    model = torch.hub.load('pytorch/vision:v0.6.0', 'densenet121', pretrained=True)
    model.eval()
    return model


async def run_inference(model, input_image):
    with torch.no_grad():
        output = model(input_image)
    return output.squeeze().numpy()


@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
    contents = await file.read()
    input_image = Image.open(io.BytesIO(contents)).convert('RGB')
    input_tensor = torch.unsqueeze(torch.from_numpy(np.asarray(input_image)), dim=0).float() / 255.
    model = await get_model()
    output = await run_inference(model, input_tensor)
    return {"prediction": output.tolist()}

在上面的示例中,我们使用DenseNet预先训练的模型来识别图像中的对象。我们使用PyTorch来预处理图像和异步运行预测模型。我们还添加了一个异步路由处理器函数,用于上传图像并调用预测模型。

在“/predict/”路径中,我们使用UploadFile类来上传图像。我们使用io.BytesIO流来从字节内容中读取数据,并使用Pillow库从字节流中读取图像数据。我们使用异步方式加载模型,以便不会阻塞应用程序的执行。使用异步方式运行模型并获取其输出,然后使用响应结果返回预测结果。最后,使用output.tolist()将输出转换为列表格式,以便在返回响应时序列化为JSON格式。

总结

在本文中,我们介绍了如何使用Python的ASGI和FastAPI来实现异步编程。我们提供了两个示例,用于说明如何使用FastAPI实现异步编程,以及如何使用异步模型和计算机视觉应用程序。使用Python进行异步编程的许多优点使其成为处理高并发和低延迟请求的理想选择。FastAPI是一个众所周知的Web框架,它可以使我们轻松地构建异步Web应用程序。

本文链接:https://my.lmcjl.com/post/19068.html

展开阅读全文

4 评论

留下您的评论.