快速了解FastAPI与Uvicorn是什么?

概念

什么是Uvicorn

Python Uvicorn 是一个快速的 ASGI(Asynchronous Server Gateway Interface)服务器,用于构建异步 Web 服务。它基于 asyncio 库,支持高性能的异步请求处理,适用于各种类型的 Web 应用程序。

Uvicorn 是由 Starlette 框架的作者编写的 ASGI 服务器,旨在提供高性能的异步请求处理能力。它使用 asyncio 库实现异步 I/O 操作,支持 HTTP 和 WebSocket 协议,可与各种 ASGI 应用程序框架(如 FastAPI、Django、Starlette 等)配合使用。

  • Uvicorn is an ASGI web server implementation for Python. Uvicorn
  • supports HTTP/1.1 and WebSockets.

源码地址: uvicorn
在这里插入图片描述

安装命令

pip install "uvicorn[standard]"

安装的是uvicorn-0.29.0

配置选项

Uvicorn 提供了丰富的配置选项,以满足不同需求。可以通过命令行参数或配置文件来配置 Uvicorn 的行为。
以下是一些常用的配置选项:

  • –host:指定主机地址,默认为 127.0.0.1。
  • –port:指定端口号,默认为 8000。
  • –workers:指定工作进程数量,默认为 CPU 核心数的 1 倍。
  • –log-level:指定日志级别,默认为 info。
  • –reload:在代码修改时自动重新加载应用程序。

查看帮助命令:

uvicorn --help

什么是FastAPI

在这里插入图片描述
FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.8+ based on standard Python type hints.

The key features are:

  • Fast: Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic). One of the fastest Python frameworks available.
  • Fast to code: Increase the speed to develop features by about 200% to 300%. *
  • Fewer bugs: Reduce about 40% of human (developer) induced errors. *
  • Intuitive: Great editor support. Completion everywhere. Less time debugging.
  • Easy: Designed to be easy to use and learn. Less time reading docs.
  • Short: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.
  • Robust: Get production-ready code. With automatic interactive documentation.
  • Standards-based: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema.

* estimation based on tests on an internal development team, building production applications.

安装命令

pip install fastapi==0.110.1

示例

同步http服务

源代码

from typing import Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: Union[bool, None] = None@app.get("/")
def read_root():return {"Hello": "World"}fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):return fake_items_db[skip: skip + limit]@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}

启动命令

web1中python文件的名称web1.py

uvicorn web1:app --reload

输出如下:
在这里插入图片描述

查看swagger

  • http://127.0.0.1:8000/docs: 自动交互API文档(由Swagger UI提供)
  • http://127.0.0.1:8000/redoc:备选自动文档(由 ReDoc提供)

在这里插入图片描述
在这里插入图片描述

异步http服务

  • asynccontextmanager

源代码

import asyncio
from asyncio import Queue
from contextlib import asynccontextmanager
from dataclasses import dataclass
from random import randint
from uuid import UUID, uuid1import uvicorn
from fastapi import FastAPIasync def commandA(queue: Queue):while True:print("Start to get task from a_queue")user_request: UserRequest = await queue.get()print(f"Got the task from the a_queue and guess will process {str(user_request.process_time)} seconds")await asyncio.sleep(user_request.process_time)queue.task_done()print(f"Completed task, task type is {user_request.type}, task id is {user_request.tracking_id}")async def commandB(queue: Queue):while True:print("Start to get task from b_queue")user_request: UserRequest = await queue.get()await asyncio.sleep(user_request.process_time)print(f"Got the task from the b_queue and guess will process {str(user_request.process_time)} seconds")queue.task_done()print(f"Completed task, task type is {user_request.type}, task id is {user_request.tracking_id}")async def commandC(queue: Queue):while True:print("Start to get task from c_queue")user_request: UserRequest = await queue.get()await asyncio.sleep(user_request.process_time)print(f"Got the task from the c_queue and guess will process {str(user_request.process_time)} seconds")queue.task_done()print(f"Completed task, task type is {user_request.type}, task id is {user_request.tracking_id}")@asynccontextmanager
async def lifespan(app: FastAPI):asyncio.create_task(commandA(a_queue))asyncio.create_task(commandB(b_queue))asyncio.create_task(commandC(c_queue))yieldapp = FastAPI(lifespan=lifespan)
# app = FastAPI()a_queue = Queue()
b_queue = Queue()
c_queue = Queue()@dataclass
class RequestBody:type: str@dataclass
class UserRequest:tracking_id: UUID# A,B,Ctype: str = ""process_time: int = None@app.post("/")
async def post_task(reqeust_body: RequestBody):user_request = UserRequest(tracking_id=uuid1(),type=reqeust_body.type,process_time=randint(1, 5))# put requests to queueif user_request.type == "A":await a_queue.put(user_request)elif user_request.type == "B":await b_queue.put(user_request)elif user_request.type == "C":await c_queue.put(user_request)print(f"Received task, task type is {user_request.type}, task id is {user_request.tracking_id}")return "Received your request"# @app.on_event("startup")
# def start_command_listener():
#     asyncio.create_task(commandA(a_queue))
#     asyncio.create_task(commandB(b_queue))
#     asyncio.create_task(commandC(c_queue))if __name__ == "__main__":uvicorn.run(app=app, port=9000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596114.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用

窜天猴AI直播软件功能列表

迎新点名:新进直播间的用户随机指数级自由组合话术,并播报出来 礼物/关注:用户送礼物、关注以及灯牌事件同上根据话术指数级随机组合出来评论区关键字回复:用户评论后,根据预设置的关键字进行语音回复 自动寻品&…

IDEA2023创建SpringMVC项目

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁👊 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 💝 前言 今天在登录redis时&#xff0c…

在GAZEBO中添加GPS模拟

文章目录 卫星导航能给机器人提供什么信息?gazebo测试环境 卫星导航能给机器人提供什么信息? 正常工作时,实际上可以提供机器人所需的所有定位信息,包括: 位置 姿态 速度等物理量 但是仅依靠卫星导航还不足以让机…

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

自动驾驶执行层 - 线控底盘基础原理(非常详细)

自动驾驶执行层 - 线控底盘基础原理(非常详细) 附赠自动驾驶学习资料和量产经验:链接 1. 前言 1.1 线控的对象 在自动驾驶行业所谓的“感知-定位-决策-执行”的过程中,在末端的执行层,车辆需要自主执行决策层所给出的指令,具体…

c# wpf LiveCharts 绑定 多线条 简单试验

1.概要 c# wpf LiveCharts 绑定 多线条 简单试验 2.代码 <Window x:Class"WpfApp3.Window4"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http:…

gulp项目配置,压缩css,压缩js,进行监听文件改动

1&#xff0c;创建项目 npm install -g gulp这个应该很熟悉&#xff0c;就是全局安装gulp 2&#xff0c;创建一个工程&#xff0c;使用node创建&#xff0c;统一命令 npm init -y3,创建后&#xff0c;目录出现一个package.json文件&#xff0c;没错&#xff0c;就是我们用vu…

Vue 有哪些常用的指令

目录 1. 指令 v-html 1.1. 作用 1.2. 语法 1.3. 练习 2. 指令 v-show 2.1. 作用 2.2. 语法 3. 原理 4. 场景 3. 指令 v-if 3.1. 作用 3.2. 语法 3.3. 原理 3.4. 场景 4. 指令 v-else与 v-else-if 4.1. 作用 4.2. 语法 4.3. 注意 4.4. 使用场景 5. 指令 v-on 5…

[VulnHub靶机渗透] pWnOS 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

可行驶区域(freespace)如何标注

可行驶区域&#xff08;freespace&#xff09;如何标注 附赠自动驾驶学习资料和量产经验&#xff1a;链接 可行驶区域的检测主要是为自动驾驶提供路径规划辅助&#xff0c;可以实现整个的路面检测&#xff0c;也可以只提取出部分的道路信息&#xff0c;不同的环境&#xff0c…