构建高性能异步任务引擎:FastAPI + Celery + Redis
在现代应用开发中,异步任务处理是一个常见的需求。无论是数据处理、图像生成,还是复杂的计算任务,异步执行都能显著提升系统的响应速度和吞吐量。今天,我们将通过一个实际项目,探索如何使用 FastAPI、Celery 和 Redis 构建一个高性能的异步任务引擎。
项目背景
技术栈介绍
- FastAPI:一个现代、高性能的 Web 框架,基于 Python 3.7+ 的异步编程特性构建。它支持自动生成 OpenAPI 文档和 Swagger UI,能够快速构建 RESTful API,并且具有极低的延迟和高并发处理能力。
- Celery:一个分布式任务队列系统,主要用于处理异步任务和定时任务。它支持多种消息传输机制,能够将任务分发到多个工作节点上并行处理,从而提高系统的吞吐量和响应速度。
- Redis:一个高性能的键值存储系统,常用于缓存、消息队列和分布式锁等场景。在 Celery 中,Redis 通常作为消息代理(Broker)和结果存储(Backend),负责任务的分发和结果的持久化。
项目目标
通过 FastAPI、Celery 和 Redis 的结合,构建一个能够高效处理用户提交的 Python 代码的异步任务引擎。用户可以通过 API 提交代码,系统会异步执行代码,并返回任务的执行结果。
项目目录结构
project/
├── main.py
├── utils.py
├── schemas.py
└── app/├── __init__.py├── config.py└── tasks/├── __init__.py└── tasks.py
代码功能深度解析
1. main.py
:FastAPI 应用的核心
main.py
是项目的核心入口文件,负责定义 FastAPI 应用的接口和逻辑。
FastAPI 应用初始化
app = FastAPI(title="Async Task API", description="", version="1.0.0")
这里我们创建了一个 FastAPI 应用,命名为 Async Task API
,版本为 1.0.0
。
自定义 Swagger UI
def swagger_monkey_patch(*args, **kwargs):return get_swagger_ui_html(*args,**kwargs,swagger_js_url="https://cdn.bootcdn.net/ajax/libs/swagger-ui/5.6.2/swagger-ui-bundle.js",swagger_css_url="https://cdn.bootcdn.net/ajax/libs/swagger-ui/5.6.2/swagger-ui.min.css",)
applications.get_swagger_ui_html = swagger_monkey_patch
通过 Monkey Patch 的方式,我们自定义了 Swagger UI 的资源加载路径,使用了国内的 CDN 加速资源,提升文档加载速度。
全局异常处理
@app.exception_handler(Exception)
def validation_exception_handler(request, err):base_error_message = f"Failed to execute: {request.method}: {request.url}"return JSONResponse(status_code=400, content={"message": f"{base_error_message}. Detail: {err}"})
我们定义了一个全局异常处理器,捕获所有未处理的异常,并返回一个包含错误信息的 JSON 响应。
HTTP 中间件:计算请求处理时间
@app.middleware("http")
async def add_process_time_header(request, call_next):start_time = time.time()response = await call_next(request)process_time = time.time() - start_timeresponse.headers["X-Process-Time"] = str(f'{process_time:0.4f} sec')return response
这个中间件用于计算每个请求的处理时间,并将处理时间添加到响应头 X-Process-Time
中,方便调试和性能优化。
创建任务的 API
@app.post('/tasks')
def create_pytask(task: schemas.PyTask):code = task.codetime_limit = task.time_limitexpires = task.expiresresult = execute_python_code.apply_async(args=(code,), time_limit=time_limit, expires=expires)return JSONResponse(content={"task_id": result.id})
用户可以通过 /tasks
接口提交 Python 代码,代码会被异步执行。任务的执行结果可以通过 /tasks/{task_id}
接口查询。
查询任务结果的 API
@app.get('/tasks/{task_id}', response_model=schemas.PyTaskResult)
def get_task_result(task_id: str):return get_task_info(task_id)
用户可以通过 /tasks/{task_id}
接口查询任务的执行结果和状态。
2. utils.py
:任务信息获取工具
utils.py
文件定义了一个工具函数 get_task_info
,用于获取 Celery 任务的状态和结果。
def get_task_info(task_id):task_result = AsyncResult(task_id, app=app)result = {"task_id": task_id,"task_status": task_result.status,"task_result": task_result.result}return result
通过 AsyncResult
,我们可以获取任务的当前状态(如 PENDING
、SUCCESS
、FAILURE
等)和执行结果。
3. schemas.py
:数据模型定义
schemas.py
文件定义了 Pydantic 模型,用于验证和序列化请求和响应的数据。
任务请求模型
class PyTask(BaseModel):code: strexpires: Optional[int] = Nonetime_limit: Optional[int] = None
用户提交的任务请求包含以下字段:
code
: 任务的 Python 代码。expires
: 任务的过期时间(可选)。time_limit
: 任务的时间限制(可选)。
任务结果模型
class PyProgramResult(BaseModel):status: stroutput: Optional[str] = Noneerror: Optional[str] = None
任务的执行结果包含以下字段:
status
: 任务的执行状态(如success
或failure
)。output
: 任务的标准输出(可选)。error
: 任务的错误输出(可选)。
任务结果响应模型
class PyTaskResult(BaseModel):task_id: strtask_status: strtask_result: Optional[PyProgramResult] = None
任务的查询结果包含以下字段:
task_id
: 任务的 ID。task_status
: 任务的状态(如PENDING
、SUCCESS
等)。task_result
: 任务的执行结果(可选)。
4. app/__init__.py
:Celery 应用初始化
app/__init__.py
文件是 Celery 应用的初始化文件,主要用于配置 Celery 应用和任务的自动发现。
创建 Celery 应用
app = Celery('my_celery_project')
我们创建了一个名为 my_celery_project
的 Celery 应用。
加载配置
app.config_from_object('app.config')
从 app.config
文件中加载 Celery 的配置。
自动发现任务
app.autodiscover_tasks(['app.tasks'])
自动发现 app.tasks
模块中的任务。
Worker 和 Beat 初始化
@worker_init.connect
def worker_initialization(**kwargs):print("Worker 初始化开始")@beat_init.connect
def beat_initialization(**kwargs):print("Beat 初始化开始")
定义了 Worker 和 Beat 的初始化函数,分别在 Worker 和 Beat 启动时执行。
5. app/config.py
:Celery 配置
app/config.py
文件定义了 Celery 的配置。
消息代理和结果存储
broker_url = 'redis://:redisisthebest@redis:6379/0'
result_backend = 'redis://:redisisthebest@redis:6379/0'
使用 Redis 作为消息代理和结果存储。
任务结果过期时间
result_expires = 3600
任务结果在 Redis 中保存 1 小时后过期。
序列化配置
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
使用 JSON 作为任务和结果的序列化格式。
时区配置
timezone = 'Asia/Shanghai'
enable_utc = True
设置时区为 Asia/Shanghai
,并启用 UTC 时间。
6. app/tasks/tasks.py
:任务执行逻辑
app/tasks/tasks.py
文件定义了一个 Celery 任务 execute_python_code
,用于执行用户提交的 Python 代码。
@app.task
def execute_python_code(code_string):temp_file = "temp_code.py"with open(temp_file, "w") as f:f.write(code_string)try:result = subprocess.run(["python3", temp_file],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)if result.stderr:return {"status": "failure", "error": result.stderr}else:return {"status": "success", "output": result.stdout}finally:if os.path.exists(temp_file):os.remove(temp_file)
该任务将用户提交的代码字符串保存为临时文件,然后使用 subprocess.run
执行该文件,捕获标准输出和错误输出。如果执行成功,返回 success
状态和标准输出;如果执行失败,返回 failure
状态和错误输出。最后,删除临时文件。
部署分析
version: '3.8'services:fastapi:image: lab:python-packagescontainer_name: fastapiports:- 8080:8080volumes:- D:\dockerMount\code\celery:/home/codeworking_dir: /home/codecommand: python3 main.pyrestart: unless-stoppednetworks:- mynetcelery-worker:image: lab:python-packagescontainer_name: celery-workervolumes:- D:\dockerMount\code\celery:/home/celeryworking_dir: /home/celerycommand: celery -A app worker --concurrency=4 --loglevel=inforestart: unless-stoppednetworks:- mynetcelery-flower:image: lab:python-packagescontainer_name: celery-flowerports:- 5555:5555volumes:- D:\dockerMount\code\celery:/home/celeryworking_dir: /home/celerycommand: celery -A app flower --port=5555restart: unless-stoppednetworks:- mynetredis:image: bitnami/redis:7.2.4-debian-12-r16container_name: redisenvironment:- REDIS_PASSWORD=redisisthebestnetworks:- mynetnetworks:mynet:external: false
在这个 Docker Compose 配置中,我们定义了三个服务:
- fastapi:FastAPI 应用,负责接收用户请求并分发任务。
- celery-worker:Celery 工作节点,负责执行异步任务。
- celery-flower:Celery 的监控工具,提供任务执行的可视化界面。
- redis:Redis 服务,作为 Celery 的消息代理和结果存储。
代码的功能和价值
功能
-
异步任务执行:
- 用户可以通过
/tasks
接口提交 Python 代码,代码会被异步执行。 - 任务的执行结果可以通过
/tasks/{task_id}
接口查询。
- 用户可以通过
-
任务状态管理:
- 任务的状态(如
PENDING
、SUCCESS
、FAILURE
等)可以通过/tasks/{task_id}
接口查询。
- 任务的状态(如
-
高性能和可扩展性:
- 使用 FastAPI 和 Celery 构建的异步任务引擎能够处理高并发的任务请求。
- Celery 的分布式特性使得系统可以轻松扩展以应对更多的任务。
-
安全性:
- 通过设置
time_limit
和expires
,可以限制任务的执行时间和过期时间,防止恶意代码的长时间执行。
- 通过设置
-
易用性:
- FastAPI 自动生成的 Swagger UI 使得 API 的使用和调试更加方便。
- Pydantic 模型确保了请求和响应数据的类型安全。
价值
-
高效的任务处理:
- 该系统能够高效地处理大量异步任务,适用于需要异步执行代码的场景,如在线代码执行、数据处理、图像处理等。
-
可扩展性:
- 通过 Celery 的分布式任务队列,系统可以轻松扩展以处理更多的任务,适合高并发场景。
-
安全性:
- 通过限制任务的执行时间和过期时间,系统能够有效防止恶意代码的滥用。
-
易用性:
- FastAPI 和 Pydantic 的结合使得 API 的开发和维护更加简单,同时提供了自动生成的文档和类型检查。
-
灵活性:
- 系统支持自定义任务的执行逻辑,可以根据业务需求扩展任务类型和功能。
总结
通过 FastAPI、Celery 和 Redis 的结合,我们构建了一个高性能、可扩展的分布式异步任务引擎。它能够高效地处理用户提交的 Python 代码,并提供任务状态查询功能。该系统适用于需要异步执行代码的场景,具有高效、安全、易用和灵活的特点。
无论是构建一个在线代码执行平台,还是处理复杂的计算任务,这个项目都为你提供了一个强大的基础。希望这篇文章能为你带来启发,让你在异步任务处理的道路上走得更远!
附图
发送任务
查询结果
相关文章:
构建高性能异步任务引擎:FastAPI + Celery + Redis
在现代应用开发中,异步任务处理是一个常见的需求。无论是数据处理、图像生成,还是复杂的计算任务,异步执行都能显著提升系统的响应速度和吞吐量。今天,我们将通过一个实际项目,探索如何使用 FastAPI、Celery 和 Redis …...
Linux 中检查 Apache Web Server (httpd) 正常运行时间的 4 种方法
注:机翻,未校。 4 Ways To Check Uptime of Apache Web Server (httpd) on Linux November 28, 2019 by Magesh Maruthamuthu We all know about the purpose of uptime command in Linux. 我们都知道 Linux 中 uptime 命令的目的。 It is used to c…...
简易CPU设计入门:内存初始化文件(三)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后,我…...
深度解析Meta最新发布的虚拟试穿技术:一键试衣的革命性进展
随着电子商务的发展,消费者对在线购物体验的要求越来越高。为了满足这一需求,Meta最近发布了一款面向电商人群的一键试衣工具,它不仅能够实现精确控制人物的外观(虚拟试衣)和姿态(姿态迁移),还能保持参考图像中的细节纹理特征,避免失真。这项技术通过引入基于注意力机…...
Apache Solr RCE(CVE-2017-12629)--vulhub
Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...
使用二分查找法找出给定点距离给定点集合距离最近的点
1、场景描述 给定点Point A (x,y)和 直线点集合 Points [(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)......],计算出集合中距离点A最近的一个点 (如果集合中的两个点距离A点最近且相等,则只取其中一个) 2、代码&#x…...
凯酷全科技抖音电商服务的卓越践行者
在数字经济蓬勃发展的今天,电子商务已成为企业增长的新引擎。随着短视频平台的崛起,抖音作为全球领先的短视频社交平台,不仅改变了人们的娱乐方式,也为品牌和商家提供了全新的营销渠道。厦门凯酷全科技有限公司(以下简…...
复盘:“辩论赛”复盘
这个小活动整个下来,我是按照“策划-执行-总结-复盘“这个顺序来过的; 在策划上: 首先,针对这个论题,我其实很清楚有很多问题,比如引起逆反心理,没想到还有不少人参与。 其次,针对这…...
SSD目标检测算法
SSD(Single Shot MultiBox Detector)是一种基于深度学习的目标检测算法,它结合了高效的检测策略和准确的检测结果。相比于传统的目标检测算法,SSD能够在保持较高准确性的同时快速地进行目标检测。 SSD算法的主要特点包括以下几个…...
MyBatis通过注解配置执行SQL语句原理源码分析
文章目录 前置准备流程简要分析配置文件解析加载 Mapper 接口MapperAnnotationBuilder解析接口方法注解parseStatement 方法详解MapperBuilderAssistant 前置准备 创建一个mybatis-config.xml文件,配置mapper接口 <mappers><!--注解配置--><mapper…...
12_HTML5 Video(视频) --[HTML5 API 学习之旅]
HTML5 引入了 <video> 标签,使得在网页中嵌入和控制视频变得非常简单。<video> 元素允许你直接在 HTML 中指定视频文件,并提供了多种属性和方法来控制视频的播放、暂停、音量等。 基本用法 HTML5 的 <video> 标签让嵌入和控制视频变…...
JaxaFx学习(三)
目录: (1)JavaFx MVVM架构实现 (2)javaFX知识点 (3)JavaFx的MVC架构 (4)JavaFx事件处理机制 (5)多窗体编程 (6)数据…...
视频点播系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...
Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
文章目录 前言功能简述1. 自定义日志文件名2. 归档规则 && 压缩2.1. 归档配置2.2. 归档压缩2.3. 日志格式 && 编码 现象原因解决办法 前言 在 Springboot 应用中,默认使用 logback-spring.xml 配置日志相关 功能简述 1. 自定义日志文件名 <fi…...
智慧工地整体解决方案
智慧工地背景与需求 智慧工地解决方案的提出,源于建筑行业面临的诸多挑战。安全事故频发、环保体系不健全、建筑信息化水平低以及施工现场管理难度大等问题,迫切需要通过智能化手段来提升工地管理的效率与安全性。智慧工地利用现代信息技术,…...
【读书打卡版】【读书笔记】半小时漫画中国地理3
一 如果全中国是个班级,江南五省各不同 继续跟随长江的脚步,认识坐在长江中下游平原上的省份:安徽、江苏、江西、浙江、上海。他们同属于一个美丽又富饶的大区——江南。 那么问题来了,一提到江南,你会想到什么&#…...
harmony UI组件学习(1)
Image 图片组件 string格式,通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式,可以加载像素图,常用在图片编辑中 Image(pixelMapobject) Resource格式,加…...
ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载
引言: 热力图(Heatmap)是一种数据可视化技术,它通过颜色的深浅变化来表示数据在不同区域的分布密集程度。在二维平面上,热力图将数据值映射为颜色,通常颜色越深表示数据值越大,颜色越浅表示数…...
React状态管理常见面试题目(一)
1. Redux 如何实现多个组件之间的通信?多个组件使用相同状态时如何进行管理? Redux 实现组件通信 Redux 是一个集中式的状态管理工具,通过共享一个全局 store 来实现多个组件之间的通信。 通信机制: 所有状态保存在 Redux 的全局 store 中。使用 ma…...
.NET周刊【12月第2期 2024-12-08】
国内文章 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名) https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系统由.net core和WPF开发,旨在开放、开源、共享。开发者为解决360与其他国产管家的误…...
YOLOv8目标检测(七)_AB压力测试
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…...
多个图片转换为PDF文件
将多个图片转换为PDF文件在Python中可以通过多个库来实现,其中最常用的库之一是Pillow(用于图像处理)和reportlab(用于生成PDF)。不过,对于直接图片转PDF的操作,更推荐使用Pillow配合PyMuPDF&am…...
【递归,搜索与回溯算法 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(一)
找出所有子集的异或总和再求和 题目解析 算法原理 解法 决策树 这种决策使得每一次递归都是有效的递归,每一个节点都是最终的结果,所以这棵决策树是不用剪枝的,也没有递归出口的; 注意 决策树执行添加元素…...
对 MYSQL 架构的了解
MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分: 一、连接层 客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)…...
深入解析 StarRocks 物化视图:全方位的查询改写机制
小编导读: 本文将重点介绍如何利用物化视图进行查询改写。文章将全面介绍物化视图的基本原理、关键特性、应用案例、使用场景、代码细节以及主流大数据产品的物化视图改写能力对比。 物化视图在 StarRocks 中扮演着至关重要的角色,它是进行数据建模和加速…...
k8s常见问题及debug
ERROR1 ErrImagePull pod pending 外网无法方位集群服务 kubectl 命令失败 Pod Error 进入容器失败 pod重启 Running not ready CrashLoopBackOff PV/PVC helm install...
Winnows基础(2)
Target 了解常见端口及服务,熟练cmd命令,编写简单的 .bat 病毒程序。 Trail 常见服务及端口 80 web 80-89 可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主机管理系统登陆(国外用的…...
(14)D-FINE网络,爆锤yolo系列
yolo过时了?传统的yolo算法在小目标检测方面总是不行,最新算法DEIM爆锤yolo,已经替yolo解决。 一、创新点 这个算法名为DEIM,全称是DETR with Improved Matching for Fast Convergence,其主要创新点在于提出了一…...
关于数据流图绘制和使用上的一些个人经验
假设我们需要开发一个项目进度管理系统,在这个项目进度管理系统之中,我们需要开发一个功能:项目成员的列表。我们具有这样的业务需求: 在项目进度管理系统中,我们需要知道参与项目的人员到底有哪些,并且项目…...
Leetcode Hot 100 【二叉树】104. 二叉树的最大深度
104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3…...
雅思真题短语梳理(八)
126员工流动率高 high staff turnover 127(多)负担一些工作任务 cover some duties / an increased workload 128不满 feel upset and resentful 129偏向性待遇 preferential treatment 130介入帮忙 step in and help 131切实的好处 tangible benefits 132挽留 staff retention…...
Codeforces Round 993 (Div. 4)个人训练记录
Codeforces Round 993 (Div. 4) 只选择对我有价值的题目记录 E. Insane Problem 题目描述 给定五个整数 k k k, l 1 l_1 l1, r 1 r_1 r1, l 2 l_2 l2 和 r 2 r_2 r2,Wave 希望你帮助她计算满足以下所有条件的有序对 …...
java-io流
根据流的方向: 输入流(InputStream/Reader):从数据源读取数据到程序中。输出流(OutputStream/Writer):将数据从程序写入到目的地。 根据流处理信息的大小: 字节流(Byte S…...
数据可视化
数据可视化 数据可视化 数据可视化主要目的:借助于图形化手段,清晰有效地传达与沟通信息。数据可视化可以把冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理。 常用的数据可视化库: D3.js 目前 Web 端评价最高的 Javascri…...
CompletableFuture使用详解
一、 CompletableFuture介绍 平时多线程开发一般就是使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高,多多使用是可以熟悉这些内容。这些内容组合在…...
【长期有效】短链接生成-短链接-短网址-短链接生成接口-短链接转换接口-短网址URL生成-短链接-短网址-短域名-短链接
短链接API接口的作用主要体现在以下几个方面: 一、链接缩短与分享优化 短链接API接口的主要功能是将长链接转换为短链接。这种转换使得链接更加简洁、易读和易分享,尤其在社交媒体、电子邮件、短信等字符受限或按字符计费的场合中,短链接能…...
使用Idea自带的git功能进行分支合并
文章目录 1.背景描述2.分支切换3.分支合并的具体操作4.将在local环境下,从dev合并到qas分支上的代码,推送到远端 1.背景描述 目前在开发的当前项目有四个分支,master(主分支)、pre(预生产分支)、qas(测试分支)、dev(开发分支); …...
工业摄像机基于电荷耦合器件的相机
工业摄像机系列产品及其识别技术的详细介绍: 一、工业摄像机概述 工业摄像机是利用光学成像技术获取视觉信息,并通过图像处理算法分析这些信息的设备。它通常具有高图像稳定性、高传输能力和高抗干扰能力等特性,适用于各种复杂的工业环境。 …...
【期末大作业】使用Python熟练掌握面向对象
引言 在编程学习过程中,构建项目是一个非常有效的方式,不仅能巩固和应用所学的知识,还能通过实践来解决实际问题。本文将通过几个经典的项目示例来展示如何用面向对象的方式设计和实现一个完整的系统,包括学生成绩管理系统、图书…...
JAVA:代理模式(Proxy Pattern)的技术指南
1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…...
【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南
硬件:Apple M4 Pro 16寸 系统: macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…...
【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
【华为OD-E卷-寻找关键钥匙 100分(python、java、c、js、c)】 题目 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成) 的箱子,并给出箱子编号,箱子编…...
SQL MID()
SQL中的MID()函数是一个用于从指定位置开始截取字符串中指定长度的子串的函数。这个函数在数据库查询和数据处理中经常被使用,特别是在需要从较长的文本字段中提取特定信息时。 MID()函数的基本语法是:SELECT MID(column_name, start, length) FROM tab…...
Sui 基金会任命 Christian Thompson 为新任负责人
Sui 基金会是专注于推动 Sui 蓬勃发展的生态增长与采用的机构。近日,基金会宣布任命 Christian Thompson 为新任负责人。在 Sui 主网发布的开创性一年里,Sui 凭借其无与伦比的速度、可扩展性和效率,迅速崛起为领先的 Layer 1 区块链之一&…...
ViEW生命周期
Vue的生命周期是指Vue实例从创建到销毁的整个过程,包括多个阶段和对应的钩子函数。以下是Vue生命周期的详细说明: 1. **创建阶段**: - beforeCreate:在实例初始化之前调用,此时数据观测和事件配置尚未完成,…...
[蓝桥杯 2019 国 B] 排列数
目录 前言 题解 思路 疑问 解答 前言 对于本篇文章是站在别人的基础之上来写的,对于这道题作为2019年国赛B组的最难的一题,他的难度肯定是不小的,这道题我再一开始接触的时候连思路都没有,也是看了两三遍别人发的题解&#x…...
python 中执行from elasticsearch import Elasticsearch,AsyncElasticsearch 报错
在 Python 中执行 from elasticsearch import Elasticsearch, AsyncElasticsearch 时,如果提示 AsyncElasticsearch 不存在,可能是因为以下几个原因: 1. 安装的 elasticsearch 库版本不匹配 AsyncElasticsearch 是在 elasticsearch 库的较新版本中引入的。如果你安装的版本…...
git 删除鉴权缓存及账号信息
在Windows系统下 清除凭证管理器中的Git凭据 按下Win R键,打开“运行”对话框,输入control,然后回车,打开控制面板。在控制面板中找到“用户账户”,然后点击“凭据管理器”。在凭据管理器中,找到“Windows…...
浏览器要求用户确认 Cookies Privacy(隐私相关内容)是基于隐私法规的要求,VUE 实现,html 代码
Cookie Notices and Cookie Consent | Cookiepedia 1. 法律法规要求 许多国家和地区的隐私法律要求网站在存储或处理用户数据(包括 Cookies)之前必须获得用户的明确同意: GDPR(欧盟通用数据保护条例) 要求ÿ…...
数据结构:栈和队列的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈…...