当前位置: 首页 > news >正文

Python WEB框架FastAPI (二)

Python WEB框架FastAPI (二)


最近一直在使用fastapi,随着使用的深入发现我对于它的了解还是太少了,以至于踩了一些坑。所以在这里记录一下,愿看到的小伙伴不迷路。

  • 路径传参
  • 并发问题

一、路径传参

这是对上一个传参知识的补充,除了通过request对象传参以及参数名传参,还可以通过请求路径传参。这也是开发中常用的传参方式,请看以下代码:

@app.get("/test/{id}")
def test(id):print(f"收到请求!{id}")return id

代码就不用解释了吧。相信各位都能看懂。

二、并发问题

这个部分是我今天要聊的一个重点,确实花了一些时间。

1、async关键字会导致请求阻塞

当方法添加了async关键字时,请求将被串行,后进的请求会等待前一项请求结束才能够进方法。

@app.get("/test3")
async def test():now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(now_time, "/test3")time.sleep(10)return "OK"

浏览器开启两个tag访问/test3,后台只会打印一个/test3,另一个10s中之后才会被打印出来。
在这里插入图片描述

2、不使用async,相同的请求会被阻塞

如果两个请求完全相同,则会阻塞等待前一个请求结束。

@app.get("/test4")
def test(request: Request):now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(now_time, request.url)time.sleep(10)return "OK"

浏览器开两个tag,访问 /test4,第二个请求会在 10s后进入,跟async使用时效果相同。
在这里插入图片描述
分别用edge和chrome访问 /test,两个请求则会同时进入。
在这里插入图片描述
另外如果是同一浏览器请求,但是携带的参数不同,结果也会同时进入:
在这里插入图片描述
综上,如果要实现并发,去掉async关键字即可,完全一样的请求会被阻塞,个人认为也是正常的,也能够防止恶意攻击。

3、使用线程池控制并发量

创建全局线程池,并发量为2

# 创建全局线程池
thread_pool = ThreadPoolExecutor(max_workers=2)def long_running_task(id):print(f"{id} 开始执行!")time.sleep(10)return "OK"@app.get("/test/{id}")
def test(request: Request, id):print(f"{id} 请求进入!")future = thread_pool.submit(long_running_task, id)# 等待任务结束res = future.result()return res

当四个请求同时访问,请求会同时进入,但是只会同时处理两个请求:
在这里插入图片描述

以上便是本次的一个学习笔记,欢迎大家留言探讨!
最后奉上完整的测试源码:

import time
from argparse import ArgumentParser
from concurrent.futures import ThreadPoolExecutor
from datetime import datetimeimport uvicorn
from fastapi import FastAPI, Requestapp = FastAPI()# 创建全局线程池
thread_pool = ThreadPoolExecutor(max_workers=2)def long_running_task(id):print(f"{id} 开始执行!")time.sleep(10)return "OK"@app.get("/test/{id}")
def test(request: Request, id):print(f"{id} 请求进入!")future = thread_pool.submit(long_running_task, id)# 等待任务结束res = future.result()return res@app.get("/test3")
async def test():now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(now_time, "/test3")time.sleep(10)return "OK"@app.get("/test4")
def test(request: Request):now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(now_time, request.url)time.sleep(10)return "OK"if __name__ == "__main__":# 创建解析器parser = ArgumentParser()# 添加命令行参数parser.add_argument('--host', default="0.0.0.0", type=str, help='Server bound address')parser.add_argument('--port', default=8000, type=int, help='Port number')# 解析命令行参数args = parser.parse_args()# 启动服务器uvicorn.run(app=app, host=args.host, port=args.port)

相关文章:

Python WEB框架FastAPI (二)

Python WEB框架FastAPI (二) 最近一直在使用fastapi,随着使用的深入发现我对于它的了解还是太少了,以至于踩了一些坑。所以在这里记录一下,愿看到的小伙伴不迷路。 路径传参并发问题 一、路径传参 这是对上一个传参…...

基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…...

JavaScript数组去重常用方法

数组去重是在 JavaScript 开发中经常遇到的问题。本文将从前言、分析、使用场景、具体实现代码和注意事项等方面,详细讨论 JavaScript 数组去重的方法。 前言: 在 JavaScript 中,数组是一种常用的数据结构,用于存储多个值。然而…...

蓝牙电话之HFP—电话音频

1 媒体音频: 播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方式有:SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式,最基础的编码方式是SBC&#xff0…...

JDBC基本概念

什么是JDBC JDBC概念 JDBC(Java DataBase Connectivity)是一套统一的基于Java语言的关系数据库编程接口规范。 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库, …...

leetcode876 链表的中间节点

题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。 输入&a…...

了解方法重写

父类 package com.mypackage.oop.demo07;//重写都是方法的重写,与属性无关 public class B {public static void test(){System.out.println("B>test.()");}public void test2(){System.out.println("B2>test.()");} }子类 package com…...

2、从“键鼠套装”到“全键盘游戏化”审核

1、风行内容仓的增效之路 - 前言 内容仓成立初期,安全审核组是规模最大的小组,占到部门人数的半壁江山,因此增效工作首先就从安全审核开始。 早期安全审核每天的达标值在800条左右,每天的总审核量不到1万,距离业务部门…...

【flutter】架构之商城main入口

架构之商城main入口 前言一、项目模块的划分二、入口main的配置三、配置文件怎么做总结 前言 本栏目我们将完成一个商城项目的架构搭建,并完善中间的所有功能,总页面大概200个,如果你能看完整个栏目,你肯定能独立完成flutter 项目…...

linux学习实操计划0103-安装软件

本系列内容全部给基于Ubuntu操作系统。 系统版本:#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 1 安装deb格式软件 Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。 处理这些包的经典程序是…...

git vscode

01:工作区 **02:暂存区 git add . 3:本地库 git commit -m ’ 4:远程库 git push example 点击箭头之后...

Linux命令行批量删除文件

1、 删除当前目录下60min前的所有.log结尾文件 find ./ -type f -name "*.log" -mmin 60 -delete 2、删除当前目录下30天前的所有.log结尾文件 find ./ -type f -name "*.log" -mtime 30 -delete...

CAN - 基础

CAN 基础 概念分类特点物理层收发器线与编码方式通信方式采样点/位 常见故障 数据链路层CAN控制器数据帧分类数据帧格式数据帧DBC解析CRC校验远程帧 总线竞争与仲裁非破坏性仲裁机制 节点状态与错误处理机制节点状态错误处理机制错误帧 概念 分类 CANCAN FD高速CAN低俗容错CA…...

【Hash表】找出出现一次的数字-力扣 136

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

Resize和centerCrop的区别

首先要记住,transforms只能对PIL读入的图片进行操作,而且PIL和opencv只能读取H * W * C形式的图片。 resize(size):将图片的短边缩放成size的比例,然后长边也跟着缩放,使得缩放后的图片相对于原图的长宽比不变。如果想要resize成自己想要的图…...

无涯教程-JavaScript - SUM函数

描述 SUM函数可添加值。 语法 SUM (number1, [number2]...)争论 Argument描述Required/Optionalnumber1The first number you want to add. The number can be a value, a cell reference, or a cell range.Requirednumber2, …You can specify up to 255 additional numbe…...

ChatGLM P-Tuningv2微调定制AI大模型

前言 什么是模型微调 想象一下,你正在学习如何弹奏一首钢琴曲目。你已经学会了一些基本的钢琴技巧,但你想要更进一步,尝试演奏一首特定的曲目。这时,你会选择一首你感兴趣的曲目,并开始深度练习。 Fine-tuning(微调)在机器学习中也是类似的概念。当我们使用预先训练好…...

关于RISC-V安全性的全面综述

目录 摘要引言RISC-V安全综述通用平台的安全要求信任的根源与硬件安全模块OTP管理模块安全内存对称加密(如AES)引擎不对称加密[131](例如,公钥RSA)引擎HASH/HAMC引擎随机数/位生成(例如TRNG[136]&#xff0…...

Python基础语法规则和Java不同的地方

Java是现在最流行的语言,也是广大程序员最熟悉的语言。然而,随着人工智能领域的快速发展,Python作为新星崭露头角。通过对比Java语言来学习Python语言,可以事半功倍。 首先,我们来看Python和Java在注释上的区别。在Jav…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...