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

FastAPI 实现 Express 框架的 p-limit(1) 防并发操作

背景

以下是将 Electron 主进程中的 CURD 逻辑(Express 实现)迁移到 FastAPI 的完整方案,包含技术选型、实现步骤和注意事项,确保主进程与子进程解耦且稳定运行:

关键点

  1. 注意用 conda 安装 python 版本时,低于 12 时,注意将 openssl 变为 1.1.1,否则 pip install 装包时会报 ssl 错误。从下面的图能看出

    1. python 新版本应该都兼容 1.1.1 版本,但是从 3.10 版本后,使用 conda 时,尽量让 openssl 设为 3.0 版本

  1. p-limit 对应的 python 限流器 asyncio.Semaphore(1)

源代码

// server.py
import asyncio
from fastapi import FastAPI
import uvicorn# Semaphore 限制并发为 1
semaphore = asyncio.Semaphore(1)# 创建 FastAPI 实例
app = FastAPI()async def handle_request(request_id):async with semaphore:print(f"Request {request_id} is being processed...")await asyncio.sleep(2)  # 模拟一个耗时的异步任务print(f"Request {request_id} is finished.")return f"Request {request_id} is finished."@app.get("/process/{request_id}")
async def process_request(request_id: int):result = await handle_request(request_id)return {"message": result}# 启动服务
if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)// client.py
import asyncio
import aiohttp
import time# 请求处理函数
async def send_request(session, i):start_time = time.time()try:print(f"Request {i} - 开始请求: {start_time}")async with session.get(f"http://localhost:8000/process/{i}", timeout=60) as response:data = await response.json()end_time = time.time()print(f"Request {i} - 完成时间: {end_time}, 耗时: {end_time - start_time:.2f}秒")print(f"Request {i} - Response: {response.status}")print(f"Request {i} - Content: {data}")return {"request_id": i,"status": response.status,"data": data,"client_time": end_time - start_time}except Exception as e:end_time = time.time()print(f"Request {i} - Error: {e}")print(f"Request {i} - 错误时间: {end_time}, 耗时: {end_time - start_time:.2f}秒")return None# 主函数
async def main():start_time = time.time()print(f"开始发送请求: {start_time}")connector = aiohttp.TCPConnector(limit=10)  # 限制最大连接数async with aiohttp.ClientSession(connector=connector) as session:tasks = [send_request(session, i) for i in range(4)]  # 4个请求results = await asyncio.gather(*tasks)end_time = time.time()print(f"所有请求完成: {end_time}")print(f"Total time: {end_time - start_time:.2f} seconds")# 打印每个请求的耗时for result in results:if result:print(f"Request {result['request_id']} - 耗时: {result['client_time']:.2f}秒")if __name__ == "__main__":asyncio.run(main())

结果展示

坑点记录

  1. 若你使用的 python3.8,直接用 pycharm 右键启动,则会在客户端初次请求后,就报异常了,但是直接在控制台,用 uvicorn 命令启动,则执行正常,用 pyinstaller 打包之后,报异常问题不会消失,因此基于 python3.8 应该是不能使用

  2. 若使用 python3.11,无论怎么启动,或者打出来的包也不会报错,说明 3.8 版本对异步的支持一般

# 这里给下 conda 创建基于openssl 3 的 python 11 环境的命令行
conda create -n py311ssl3 python=3.11 openssl=3.0

相关文章:

FastAPI 实现 Express 框架的 p-limit(1) 防并发操作

背景 以下是将 Electron 主进程中的 CURD 逻辑(Express 实现)迁移到 FastAPI 的完整方案,包含技术选型、实现步骤和注意事项,确保主进程与子进程解耦且稳定运行: 关键点 注意用 conda 安装 python 版本时&#xff0c…...

STC8H系列单片机STC8H_H头文件功能注释

#ifndef __STC8H_H__ // 条件编译:如果未定义__STC8H_H__宏 #define __STC8H_H__ // 则定义该宏,防止头文件被重复包含 / //包含本头文件后,不用另外再包含"REG51.H" // 提示:本头文件已包含基本寄存器定义 sfr P0 = …...

C#中BackgroundWorker的概念与用法详解

一、BackgroundWorker 概念 BackgroundWorker 是 C# 中用于在后台线程中运行操作的组件,它允许你在不影响用户界面(UI)响应能力的情况下执行耗时操作。 它位于 System.ComponentModel 命名空间内,主要用于 Windows 窗体应用程序中…...

RM算法的地下宫殿

证: X n 1 X n β n ( ξ n − X n ) ( 1 − β n ) X n β n ξ n X_{n1}X_n\beta_n(\xi_n-X_n)(1-\beta_n)X_n\beta_n\xi_n Xn1​Xn​βn​(ξn​−Xn​)(1−βn​)Xn​βn​ξn​。由数学归纳法可得 X n 1 ∑ j 1 n ξ j β j ∏ i j n − 1 ( 1 − β…...

WEB安全--Java安全--LazyMap_CC1利用链

一、前言 该篇是基于WEB安全--Java安全--CC1利用链-CSDN博客的补充,上篇文章利用的是TransformedMap类,而CC链的原作者是利用的LazyMap类作为介质进行的触发。 所以本文将分析国外原作者在ysoserial commonscollections1中给出的CC1利用链。 二、回顾梳…...

【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!

文章目录 一、软件安装1.1 系统配置要求1.2 安装 二、新版功能探索2.1 界面图标和深色主题2.2 MATLAB Copilot AI助手2.3 绘图区升级2.4 simulink2.5 更多 延迟一个月,终于发布了🤭。 一、软件安装 1.1 系统配置要求 现在的电脑都没问题,老…...

[网络升级指南] 服务器网卡/带宽如何选?1GbE vs 10GbE vs 25GbE+ 性能与成本深度解析 (2025)

更多服务器知识,尽在hostol.com 嘿,各位服务器“舰长”们!当你为你的“星际飞船”(服务器)配备了顶级的 CPU“引擎”、超大的内存“能源核心”、以及光速 SSD“曲速引擎”之后,是不是觉得它就能在数字宇宙…...

Nginx与Tomcat负载均衡集群配置指南

目录 一、资源清单 二、基础环境 三、安装配置Tomcat 四、安装配置Nginx 一、资源清单 主机 操作系统 IP地址 tomcat1 OpenEuler24.03 192.168.16.142 tomcat2 OpenEuler24.03 192.168.16.143 Nginx OpenEuler24.03 192.168.16.144 二、基础环境 hostnamectl …...

已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!

文章目录 已解决:安装部署Docker Deskpot之后启动出现Docker Engine Stopped!个人环境介绍自己的解决问题思路(详细过程附截图)1.打开控制面板2.点击程序和功能3.点击启动或关闭windows功能4.Hyper-V5.右键菜单栏的windows图标点击…...

C++多态实现的必要条件剖析

在C中,多态的一个必要条件确实是通过基类的指针或引用调用虚函数。这一要求背后的原因与C如何实现动态绑定(运行时多态)密切相关。下面详细解释了为什么需要使用基类的指针或引用来实现多态。 动态绑定与静态绑定 静态绑定(编译期…...

25.5.15

没有比水题更令人开心的事情了 典型的并查集题目,并查集分为并和查,并就是把有关系的父亲根结点设为同一个,查就是在成功构造后对其进行查询 查通过递归实现 if (x f[x])return x; return f[x] find(f[x]); 由于并查集的特点&#xff0…...

WebSocket:实时通信(如聊天应用)从零到一的深度解析

简介 在现代互联网应用中,实时通信已成为不可或缺的核心功能。从在线聊天到金融数据监控,从协同办公到在线游戏,实时性需求推动了WebSocket技术的广泛应用。本文将从底层协议原理出发,结合企业级开发场景,系统讲解WebSocket的实现机制、实战技巧与优化策略。通过完整的代…...

二程运输的干散货船路径优化

在二程运输中,干散货船需要将货物从一个港口运输到多个不同的目的地港口。路径优化的目标是在满足货物运输需求、船舶航行限制等条件下,确定船舶的最佳航行路线,以最小化运输成本、运输时间或其他相关的优化目标。 影响因素 港口布局与距离:各个港口之间的地理位置和距离…...

【Java ee初阶】http(1)

HTTP 全称为“超文本传输协议”,由名字可知,这是一个基于文本格式的协议,而TCP,UDP,以太网,IP...都是基于二进制格式的协议。 如何区别该协议是基于哪种格式的协议? 形如这种协议格式&#xf…...

《Deepseek从入门到精通》清华大学中文pdf完整版

资源介绍: 《DeepSeek:从入门到精通》是由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的精心撰写的一份专业文档。该文档以通俗易懂的方 式,全面介绍了DeepSeek的使用方法,为用户提供了极具价值的指导。 这份文档内容丰…...

【图片识别工具】批量单据识别批量重命名,批量OCR识别图片文字并重命名,批量改名工具的使用步骤和注意事项

一、适用场景 ​​财务与发票管理​​:企业需处理大量电子发票或扫描件,通过OCR识别发票代码、金额等关键信息,自动重命名为发票号_金额.pdf格式,便于归档与税务审计。 ​​物流单据处理​​:物流公司需从运单中提取单…...

重磅发布!OpenAI 推出最新模型 GPT-4.1 系列!

今日凌晨,OpenAI宣布开放全新模型GPT-4.1,并于即日起在ChatGPT中投入使用。 超长上下文与卓越编码能力 GPT-4.1作为OpenAI的最新模型,支持长达100万tokens的上下文,是OpenAI首次发布的长窗口模型。相较于前代,GPT-4.1…...

游戏引擎学习第281天:在房间之间为摄像机添加动画效果

回顾并为今天的内容定下基调 这次我们要继续深入处理实体系统。在前一阶段对实体系统做了一些很酷的改动,但现在到了要认真面对和完善它的时候。 今天的主要目标是修复并优化摄像机在房间之间移动时的逻辑。在上一次的实现中,我们重新启用了基于房间的…...

机器学习 --- 模型选择与调优

机器学习 — 模型选择与调优 文章目录 机器学习 --- 模型选择与调优一,交叉验证1.1 保留交叉验证HoldOut1.2 K-折交叉验证(K-fold)1.3 分层k-折交叉验证Stratified k-fold 二,超参数搜索三,鸢尾花数据集示例四,现实世界数据集示例…...

PostgreSQL pgrowlocks 扩展详解

一、简介 pgrowlocks 是 PostgreSQL 官方提供的扩展模块,用于查看指定表中每一行当前的行级锁(Row Lock)信息。它非常适用于: 并发冲突排查行级锁等待分析死锁前兆探测热点数据行分析 二、安装与启用 1. 安装前提(…...

Makefile 详解

Makefile 是一个用于自动化构建过程的脚本文件,主要用于管理源代码的编译和链接过程。它定义了项目中的依赖关系以及如何从源文件生成目标文件。 基本概念 Make:一个构建自动化工具,读取 Makefile 中的指令目标(Target):要生成的…...

IntelliJ IDEA 集成AI编程助手全解析:从Copilot到GPT-4o Mini的实践

目录 AI编程助手的演进与核心价值GitHub Copilot深度集成指南国产新星DeepSeek配置实战GPT-4o Mini低成本接入方案三大助手对比与场景适配企业级安全与本地化部署未来发展趋势与开发者启示1. AI编程助手的演进与核心价值 1.1 技术演进图谱 #mermaid-svg-LwYPrW2Y2Pqvqgf0 {fon…...

wps excel将表格输出pdf时所有列在一张纸上

记录:wps excel将表格输出pdf时所有列在一张纸上 1,调整缩放比例 2,将表格的所有铺满到这套虚线...

【开源Agent框架】OWL:面向现实任务自动化的多智能体协作框架深度解析

一、基本介绍 1.1 项目概述 OWL(Optimized Workforce Learning)是基于CAMEL-AI框架构建的创新型多智能体协作系统,旨在通过动态智能体交互实现复杂任务的自动化处理。项目在GAIA基准测试中以69.09的平均分位列开源框架榜首,展现了强大的任务处理能力。 技术特性矩阵: 多…...

120页WORD方案 | 2025企业数字化转型AI大模型数字底座项目设计方案

这份文档是一份关于企业数字化转型AI大模型数字底座项目的设计方案,涵盖了从项目概述、业务需求分析到技术架构设计等多个方面。它详细阐述了企业为何需要构建AI大模型底座,以及如何通过这一底座实现智能化决策支持、业务流程优化和客户体验提升。方案中…...

Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】

文章目录 一、前言二、问题场景三、开发环境配置(Vite)四、生产环境配置(Nginx)4.1 初始错误配置4.2 正确配置方案4.3 配置解析4.4高级配置选项 五、常见问题排查六、开发环境 vs 生产环境对比七、总结 一、前言 在前后端分离架构…...

机器视觉对位手机中框点胶的应用

在手机制造的精密世界里,每一个环节都关乎着产品的最终品质,而手机中框点胶工艺更是其中关键一环。点胶不仅起到固定内部组件、增强结构强度的作用,还影响着手机的防水、防尘性能。然而,随着手机设计日益轻薄化、复杂化&#xff0…...

Elasticsearch性能调优全攻略:从日志分析到集群优化

#作者:猎人 文章目录 前言搜索慢查询日志索引慢写入日志性能调优之基本优化建议性能调优之索引写入性能优化提升es集群写入性能方法:性能调优之集群读性能优化性能调优之搜索性能优化性能调优之GC优化性能调优之路由优化性能调优之分片优化 前言 es里面…...

Electron 主进程中使用Worker来创建不同间隔的定时器实现过程

背景 目前主进程使用 timer.setInterval 来做间隔任务执行,但是总有用户反馈养号卡主不执行了,或者某个操作不执行了,为了排除主进程的运行造成 setInterval 阻塞可能,将 setInterval 单独处理,可以排除主进程对定时器…...

用户安全架构设计

一、主动踢出,被动踢出 二、密码设计策略:密码复杂度,密码安全检查,密码失效设计,账号锁定设计,密码存储和传输加密 三、密码找回策略:密保问题,下行短信验证码,上行短信…...

2025年黑客扫段攻击激增:如何构建智能防御体系保障业务安全?

引言 2025年,随着全球物联网设备突破500亿台,黑客利用自动化工具发起的扫段攻击(IP段扫描漏洞利用)已成为企业业务安全的最大威胁之一。单次攻击可覆盖数万个IP,精准定位未修复漏洞,导致数据泄露、服务瘫痪…...

基于大模型预测胃穿孔预测与围手术期管理系统技术方案

目录 1. 系统架构模块2. 关键算法实现2.1 术前预测模型(Transformer多模态融合)2.2 术中实时分析(在线学习LSTM)3. 模块流程图(Mermaid)3.1 数据预处理系统3.2 术前预测系统3.3 术中实时分析系统4. 技术验证模块4.1 模型可解释性验证4.2 边缘计算部署架构1. 系统架构模块…...

Java转Go日记(三十六):简单的分布式

1.1.1. 简单的分布式server 目前分布式系统已经很流行了,一些开源框架也被广泛应用,如dubbo、Motan等。对于一个分布式服务,最基本的一项功能就是服务的注册和发现,而利用zk的EPHEMERAL节点则可以很方便的实现该功能。EPHEMERAL节…...

操作系统-进程与线程

操作系统 操作系统用来保护系统资源和提高稳定性的重要机制 文章目录 用户态和内核态为什么要区分状态? 进程管理进程,线程进程/线程切换进程的5种状态进程通信线程通讯进程调度算法 用户态和内核态 用户态 应用程序运行时所在的模式,权限受限…...

人体肢体渲染-一步几个脚印从头设计数字生命——仙盟创梦IDE

人体肢体动作数据集-太极拳 渲染代码 # 初始化Pygame pygame.init()# 设置窗口尺寸 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("动作回放")# 设置帧率 FPS 30 clock pyg…...

如何安全配置好CDN用于防止DDoS与Web攻击 ?

保护网站免受DDoS和Web攻击是至关重要的,CDN(内容分发网络)可以作为一种有效的防御工具。以下是一些安全配置CDN以防止DDoS和Web攻击的最佳实践: 1. 选择可靠的CDN提供商 安全功能: 选择拥有强大安全功能的CDN提供商…...

01-数据结构概述和时间空间复杂度

数据结构概述和时间空间复杂度 1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法 算法(Algorithm)就是定义良好的计算…...

【ArcGIS技巧】根据地块、界址点图层生成界址线

"农经权二轮延包我已经写的差不多了,需要的一些生成四至、分割地块的功能也分享了替代的插件。前面刚分享完界址点的生成,今天分享界址线的生成,有需要的自取,至此,基本可以用这些功能完成出成果工作。" 1、…...

PC:使用WinSCP密钥文件连接sftp服务器

1. 打开winscp工具,点击“标签页”->“新标签页” 2. 点击“高级"->“高级” 3. 点击"验证"->“选择密钥文件” 选择ppk文件,如果没有ppk文件选择pem文件,会自动生成ppk文件 点击确定 4. 输入要连接到的sftp服务器的…...

RedHat7 如何更换yum镜像源

RedHat7如何更换yum镜像源? # 删除系统自带 yum rpm -qa|grep -e yum -e python-urlgrabber |xargs rpm -e --nodeps# 下载yum与wget的rpm软件包 curl -O http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm curl -O ht…...

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时,报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…...

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用

目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器(Spacer)3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…...

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…...

spark和hadoop之间的区别和联系

Spark和Hadoop的对比 1. 架构层面 Hadoop&#xff1a; HDFS&#xff08;分布式文件系统&#xff09;&#xff1a;Hadoop的核心组件之一&#xff0c;用于存储大规模数据。它将数据分散存储在多个节点上&#xff0c;通过冗余存储&#xff08;默认三副本&#xff09;来保证数据…...

antd mobile 点击 TabBar 切换页面

switchRoute 函数&#xff0c;navigate 点击的 path import { Button, TabBar } from "antd-mobile"; import { useEffect } from "react"; import { Outlet, useNavigate } from "react-router-dom"; import { useDispatch } from "react…...

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图 2025/5/15 20:19 缘起&#xff1a;以前做的网线找不到了&#xff0c;那就再来一条吧。 引脚定义要从头来过&#xff1f;还好找到了一条。 开干&#xff01; 万用表一对/点&#xff0c;几…...

大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

【学习心得】WSL2安装Ubuntu22.04

为了使用Docker desktop&#xff0c;所以我的win10需要安装一下wsl并且下载一个Ubuntu。默认Windows10/11是自带wsl的&#xff0c;你在进行下面操作的时候可以升级一下wsl --update 1、管理员身份打开cmd&#xff0c;输入命令查询所有可以下载的Linux版本 # 查看有哪些 Linux 发…...

人工智能、深度学习、机器学习的联系与区别

定义 人工智能&#xff08;AI - Artificial Intelligence&#xff09; &#xff1a;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它旨在让计算机能够像人类一样思考、学习和决策&#xff0c;涉及到诸如计算机视觉、自然语言处理…...