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

1.Axum 与 Tokio:异步编程的完美结合

摘要

深入解析 Axum 核心架构与 Tokio 异步运行时的集成,掌握关键原理与实践技巧。

一、引言

在当今的软件开发领域,高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言,能够高效地处理大量并发请求是至关重要的。Rust 语言凭借其内存安全、高性能和并发处理能力,成为了构建高性能 Web 服务器的理想选择。Axum 作为 Rust 生态系统中的一款轻量级 Web 框架,与 Tokio 异步运行时紧密集成,为开发者提供了强大的异步编程能力。本文将深入探讨 Axum 的核心架构以及它是如何与 Tokio 异步运行时集成的,同时详细介绍 tokio::main 宏与异步任务调度原理,并通过实践构建一个高并发 HTTP 服务器。

二、Axum 核心架构概述

Axum 是一个基于 Tower 和 Hyper 构建的 Rust Web 框架,它的设计目标是提供一个简洁、高效且可扩展的 API,让开发者能够轻松构建高性能的 Web 服务。Axum 的核心架构主要由以下几个部分组成:

2.1 路由系统

Axum 的路由系统允许开发者根据不同的 URL 路径和 HTTP 方法,将请求分发到相应的处理函数中。路由系统支持静态路由、动态路由和嵌套路由,使得开发者可以灵活地组织和管理 Web 应用的 API 接口。

2.2 中间件

中间件是 Axum 框架的重要组成部分,它允许开发者在请求处理前后执行一些通用的逻辑,如日志记录、身份验证、请求压缩等。Axum 的中间件机制非常灵活,开发者可以根据需要自定义中间件,并且可以将多个中间件组合在一起使用,实现复杂的功能。

2.3 请求处理函数

请求处理函数是 Axum 中处理具体请求的函数,它接收请求并返回响应。请求处理函数可以是异步函数,这使得开发者可以在处理请求时进行异步 I/O 操作,如数据库查询、网络请求等,而不会阻塞线程。

2.4 响应生成

Axum 提供了丰富的响应生成功能,开发者可以根据需要生成不同类型的响应,如 HTML、JSON、XML 等。同时,Axum 还支持流式响应,使得开发者可以处理大数据量的响应。

三、Tokio 异步运行时简介

Tokio 是 Rust 生态系统中最流行的异步运行时,它提供了异步 I/O、任务调度、定时器等功能,使得开发者可以方便地进行异步编程。Tokio 的核心特性包括:

3.1 异步 I/O

Tokio 提供了异步 I/O 操作,如异步文件读写、异步网络通信等。异步 I/O 操作不会阻塞线程,而是在 I/O 操作完成后通知线程继续执行后续任务,从而提高了系统的并发处理能力。

3.2 任务调度

Tokio 提供了任务调度功能,它可以将多个异步任务分配到不同的线程中执行,从而充分利用多核 CPU 的性能。Tokio 的任务调度器采用了工作窃取算法,能够高效地管理和调度任务。

3.3 定时器

Tokio 提供了定时器功能,开发者可以使用定时器来执行定时任务,如定时清理缓存、定时发送心跳包等。

四、Axum 如何基于 Tokio 实现异步 I/O

Axum 基于 Tokio 实现异步 I/O 的关键在于它使用了 Tokio 提供的异步 I/O 操作和任务调度功能。具体来说,Axum 在以下几个方面与 Tokio 紧密集成:

4.1 异步请求处理

Axum 的请求处理函数可以是异步函数,这意味着在处理请求时可以进行异步 I/O 操作。例如,在处理一个数据库查询请求时,可以使用 Tokio 提供的异步数据库驱动来执行查询操作,而不会阻塞线程。以下是一个简单的示例:

use axum::{routing::get,Router,
};
use std::net::SocketAddr;// 异步请求处理函数
async fn hello_world() -> &'static str {// 模拟异步 I/O 操作tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;"Hello, World!"
}#[tokio::main]
async fn main() {// 构建路由let app = Router::new().route("/", get(hello_world));// 监听地址let addr = SocketAddr::from(([127, 0, 0, 1], 3000));// 启动服务器axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();
}

在上述示例中,hello_world 函数是一个异步函数,它使用 tokio::time::sleep 模拟了一个异步 I/O 操作。当客户端请求 / 路径时,服务器会等待 1 秒钟后返回响应。

4.2 异步中间件

Axum 的中间件也可以是异步的,这使得开发者可以在中间件中进行异步 I/O 操作。例如,在一个日志记录中间件中,可以使用 Tokio 提供的异步文件写入功能将请求信息写入日志文件。以下是一个简单的异步中间件示例:

use axum::{http::Request,middleware::Next,response::Response,
};
use std::time::Instant;
use tokio::fs::File;
use tokio::io::AsyncWriteExt;// 异步中间件
async fn logging_middleware<B>(req: Request<B>, next: Next<B>) -> Response {let start = Instant::now();// 执行后续处理let response = next.run(req).await;let elapsed = start.elapsed();// 异步写入日志文件let mut file = File::create("access.log").await.unwrap();let log_message = format!("Request took {:?}\n", elapsed);file.write_all(log_message.as_bytes()).await.unwrap();response
}

在上述示例中,logging_middleware 是一个异步中间件,它记录了请求的处理时间,并将日志信息异步写入 access.log 文件。

五、tokio::main 宏与异步任务调度原理

5.1 tokio::main

tokio::main 是 Tokio 提供的一个宏,它用于启动 Tokio 异步运行时。使用 tokio::main 宏可以将一个异步函数作为程序的入口点,Tokio 会自动创建一个异步运行时并执行该函数。以下是一个简单的示例:

#[tokio::main]
async fn main() {println!("Hello, Tokio!");
}

在上述示例中,main 函数是一个异步函数,使用 tokio::main 宏将其作为程序的入口点。当程序运行时,Tokio 会创建一个异步运行时并执行 main 函数。

5.2 异步任务调度原理

Tokio 的任务调度器采用了工作窃取算法,它将多个异步任务分配到不同的线程中执行。具体来说,Tokio 的任务调度器会维护一个全局任务队列和每个线程的本地任务队列。当一个线程空闲时,它会从全局任务队列中获取任务执行;当一个线程的本地任务队列中有任务时,它会优先执行本地任务队列中的任务。如果一个线程的本地任务队列为空,它会尝试从其他线程的本地任务队列中窃取任务执行。这种工作窃取算法使得任务调度更加高效,能够充分利用多核 CPU 的性能。

六、实践:构建高并发 HTTP 服务器

6.1 项目初始化

首先,创建一个新的 Rust 项目:

cargo new axum_tokio_server --bin
cd axum_tokio_server

6.2 添加依赖

Cargo.toml 文件中添加 Axum 和 Tokio 的依赖:

[dependencies]
axum = "0.6"
tokio = { version = "1", features = ["full"] }

6.3 编写代码

src/main.rs 文件中编写以下代码:

use axum::{routing::get,Router,
};
use std::net::SocketAddr;// 异步请求处理函数
async fn hello_world() -> &'static str {"Hello, World!"
}#[tokio::main]
async fn main() {// 构建路由let app = Router::new().route("/", get(hello_world));// 监听地址let addr = SocketAddr::from(([127, 0, 0, 1], 3000));// 启动服务器axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();
}

6.4 运行服务器

运行以下命令启动服务器:

cargo run

6.5 测试服务器

使用 curl 或浏览器访问 http://localhost:3000,如果看到 Hello, World! 则说明服务器运行成功。

七、总结

本文深入探讨了 Axum 的核心架构以及它是如何与 Tokio 异步运行时集成的。通过使用 Tokio 提供的异步 I/O 操作和任务调度功能,Axum 能够高效地处理大量并发请求,为开发者构建高性能的 Web 服务器提供了强大的支持。同时,本文详细介绍了 tokio::main 宏与异步任务调度原理,并通过实践构建了一个高并发 HTTP 服务器。希望本文能够帮助开发者更好地理解 Axum 和 Tokio 的异步编程模型,从而在实际项目中充分发挥它们的优势。

相关文章:

1.Axum 与 Tokio:异步编程的完美结合

摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成&#xff0c;掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域&#xff0c;高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言&#xff0c;能够高效地处理大量并发请求是至关重要的。Rust 语言…...

快速认识:数据库、数仓(数据仓库)、数据湖与数据运河

数据技术核心概念对比表 概念核心定义核心功能数据特征典型技术/工具核心应用场景数据库结构化数据的「电子档案柜」&#xff0c;按固定 schema 存储和管理数据&#xff0c;支持高效读写和事务处理。实时事务处理&#xff08;增删改查&#xff09;&#xff0c;确保数据一致性&…...

【Linux】第十章 配置和保护SSH

1. 简单说下ssh如何实现用户的免密登录&#xff1f; &#xff08;1&#xff09;生成公钥和私钥&#xff1a;使用 ssh-keygen -t rsa 命令&#xff0c;在客户端&#xff08;即你登录的机器&#xff09;上生成一对密钥——公钥&#xff08;~/.ssh/id_rsa.pub&#xff09;和私钥&…...

量子计算:开启未来科技之门的钥匙

在当今科技飞速发展的时代&#xff0c;量子计算正逐渐从实验室走向实际应用&#xff0c;成为全球科技领域的焦点之一。它有望为众多行业带来前所未有的变革&#xff0c;从密码学、药物研发到金融风险评估等&#xff0c;量子计算的潜力不可限量。 一、量子计算的原理 量子计算基…...

基础知识 - 结构体

1、结构体类型与结构体变量 1.1 结构体的定义 结构体是一种自定义的数据类型&#xff0c;它把多个不同类型的变量封装在一起&#xff0c;形成一个新的复合数据类型。可以定义该结构体类型的变量&#xff0c;与使用 int 定义变量的方法相同 结构体是一些值的集合&#xff0c;这…...

uniapp上传图片时(可选微信头像、相册、拍照)

参考文献&#xff1a;微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…...

2025年4月16日华为笔试第二题200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 智慧旅游路线规划 问题描述 LYA正在开发一款智慧旅游APP,该APP需要为游客规划城市景点之间的最佳路线。城市有 N N...

面试题之高频面试题

最近开始面试了&#xff0c;410面试了一家公司 针对自己薄弱的面试题库&#xff0c;深入了解下&#xff0c;也应付下面试。在这里先祝愿大家在现有公司好好沉淀&#xff0c;定位好自己的目标&#xff0c;在自己的领域上发光发热&#xff0c;在自己想要的领域上&#xff08;技术…...

一路磕磕绊绊解决flutter doctor 报错CocoaPods not installed

flutter doctor执行之后&#xff0c;出现以下错误: 错误消息&#xff1a; ✗ CocoaPods not installed.CocoaPods is a package manager for iOS or macOS platform code.Without CocoaPods, plugins will not work on iOS or macOS.For more info, see https://flutter.dev/t…...

探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因

文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …...

面试算法高频08-动态规划-01

动态规划 递归知识要点 递归代码模板&#xff1a;提供递归代码的标准形式public void recur(int level, int param) &#xff0c;包含终止条件&#xff08;if (level> MAX_LEVEL)&#xff09;、当前层逻辑处理&#xff08;process(level, param)&#xff09;、向下一层递归…...

【AI】以Llama模型为例学习如何进行LLM模型微调

以Llama模型为例学习如何进行LLM模型微调 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 以Llama模型为例学习如何进行LLM模型微调背景预训练微调全部微调参数高效微调低秩适配 (LoR…...

细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法

目录 一、函数vTaskList() 1、 函数说明 2、返回的字符串表格说明 3、函数的使用方法 二、 vTaskList()的应用示例 1、示例功能、项目设置 2、软件设计 &#xff08;1&#xff09;main.c &#xff08;2&#xff09;freertos.c &#xff08;3&#xff09;FreeRTOSConf…...

ffmpeg 添加 nvenc支持

运行以下命令检查当前 FFmpeg 是否支持 hevc_nvenc&#xff1a; ffmpeg -hide_banner -encoders | grep nvenc 若输出包含 hevc_nvenc&#xff0c;说明编码器已集成&#xff0c;问题出在驱动或参数配置若无输出&#xff0c;则需要手动编译 ffmpeg 安装显卡驱动、cuda和cudnn…...

锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》

锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》 先看结果&#xff1a;价格展示 https://atemplate.com/pricing 旧的打折价格展示 新的打折价格展示 锚定效应是什么&#xff1f; 人类在进行决策时&#xff0c;会过度偏重先前取得的资讯&#xff08;这称为锚点&…...

红宝书第四十九讲:XSS/CSRF攻击防御策略解析

红宝书第四十九讲&#xff1a;XSS/CSRF攻击防御策略解析 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 XSS&#xff08;跨站脚本&#xff09;&#xff1a;黑客把恶意代码塞进网页&#xff0c;当你打开页面时&am…...

Unity基于屏幕空间的鼠标拖动,拖动物体旋转

代码的核心在于&#xff0c;鼠标的屏幕偏移映射到物体的旋转角度&#xff0c;代码中是使用射线去检测的&#xff0c;检测帧间隔鼠标的位置对应物体上的旋转 未解决的问题&#xff1a;旋转都是相对的&#xff0c;怎么去处理&#xff0c;鼠标拖动物体&#xff0c;物体不动&#…...

Unity3D 测试驱动开发(TDD)框架设计

前言 针对Unity3D测试驱动开发&#xff08;TDD&#xff09;框架的设计&#xff0c;需要结合Unity引擎特性与TDD核心原则&#xff0c;构建可维护、高效且与开发流程深度集成的测试体系。以下是分层次的框架设计方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&a…...

Google Mock(GMock):C++单元测试的高效模拟框架详解

标题&#xff1a; Google Mock&#xff08;GMock&#xff09;&#xff1a;C单元测试的高效模拟框架详解 摘要&#xff1a; Google Mock&#xff08;GMock&#xff09;是C单元测试中的核心工具&#xff0c;能够高效隔离外部依赖并验证复杂交互逻辑。本文详细介绍了GMock的核心…...

智慧城市气象中台架构:多源天气API网关聚合方案

在开发与天气相关的应用时&#xff0c;获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具&#xff0c;可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API&#xff0c;以及其核心功能和调用…...

vue3项目启动bug

项目场景&#xff1a; vue3 项目启动运行 问题描述 终端无法正常启动运行 C:/user/adminC:/user/admin> npm run dev > student_status_vue30.0.0 dev > vite原因分析&#xff1a; 暂无 解决方案&#xff1a; 在当前项目目录下运行&#xff1a; npx vite --host…...

逻辑回归 (Logistic Regression)

文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源&#xff08;1&#xff09;从概率模型推导而来&#xff08;统计学习视角&#xff09;&#xff08…...

SLAM | 激光SLAM中的退化问题

在激光SLAM中,判断退化环境的核心是通过数学建模分析环境特征对位姿估计的约束能力。除了LOAM中提出的退化因子D外,还存在多种基于表达式和阈值设定的方法。以下是几种典型方法及其实现原理: 1. 协方差矩阵特征值分析 原理:通过分析点云协方差矩阵的特征值分布,判断环境中…...

【已更新】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题

完整内容请看文末最后的推广群 先展示问题一代码和结果、再给出四个问题详细的模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.font_manager import FontPropertiesfrom matplotlib import rcParams# 设…...

[特殊字符] 基于大模型的地理领域文档中英互译自动化方案

一、&#x1f4cc; 项目背景与挑战 在全球化商业环境中&#xff0c;跨国企业经常面临专业文档翻译的痛点&#xff1a; 传统方式效率低下&#xff1a;专业文档翻译需要专人耗时数小时甚至数天 专业术语准确性难保证&#xff1a;地理领域术语的特殊性 格式保持困难&#xff1a…...

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…...

高度图(Heightmap)

高度图的数学组成与建模方法 高度图&#xff08;Heightmap&#xff09;是一种基于规则网格的地形表示方法&#xff0c;其数学本质是将三维地形简化为二维离散函数&#xff0c;通过高度值的存储和插值实现地形重建。以下从数学建模角度系统阐述其组成原理及关键技术。 一、基础…...

2025第十七届“华中杯”大学生数学建模挑战赛题目B 题 校园共享单车的调度与维护问题完整思路 模型 代码 结果分享

共享单车目前已成为不少大学校园内学生的重要通勤工具&#xff0c;给学生的出行带来了极大便利&#xff0c;但同时也产生了一些问题&#xff0c;如共享单车投放点位设计不合理&#xff0c;高峰期运力不足等。 某高校委托一公司在校园内投放了一批共享单车&#xff0c;经过一段时…...

ESP32-idf学习(一)搭建环境和点灯

一、前言 先说一下查到的数据&#xff08;不保证准确&#xff09;&#xff1a; 1、连续四年Wi-Fi MCU全球市场份额第一&#xff0c;产品应用于智能家居、工业自动化、医疗健康等泛IoT领域‌&#xff0c;2024 年营收突破 20 亿元&#xff08;同比 40%&#xff09;&#xff0c;…...

超详细VMware虚拟机扩容磁盘容量-无坑版

1.环境&#xff1a; 虚拟机&#xff1a;VMware Workstation 17 Pro-17.5.2 Linux系统&#xff1a;Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 &#xff08;1&#xff09;在虚拟机关机的状态下&#xff0c;虚拟机硬盘扩容之前必…...

多线程(进阶续~)(内涵面试题)

目录 一、JUC 的常见类 1. Callable 接口 2. ReentrantLock ReentrantLock 的用法&#xff1a; ReentrantLock 和 synchronized 的区别&#xff1a; 何时使用何锁: 3. 原子类 4. 线程池 ExecutorService 和 Executors ThreadPoolExecutor 5. 信号量 Semaphore 6. C…...

OpenGL shader开发实战学习笔记:第十一章 立方体贴图和天空盒

1. 立方体贴图和天空盒 1.1. 什么是立方体贴图 立方体贴图&#xff08;Cube Map&#xff09;是一种纹理&#xff0c;它由六个纹理图像组成&#xff0c;每个纹理图像对应一个方向。这些方向通常是立方体的六个面&#xff0c;分别是“前面”&#xff0c;“后面”&#xff0c;“…...

双指针算法(二)

目录 一、力扣611——有效三角形的个数 二、牛客网3734——和为S的两个数字 三、力扣15——三数之和 四、力扣18——四数之和 一、力扣611——有效三角形的个数 题目如下&#xff1a; 这里我们先认识如何判断是个三角形&#xff0c;ab>c,ac>b,bc>a即为三角形 这里…...

docker Windows 存放位置

docker Windows 存放位置 镜像文件层可能是这 docker的overlay2中存的都是什么and如何清理/var/lib/docker/overlay2_docker overlay 是什么目录-CSDN博客 存的是我们的镜像文件和容器内的文件 \\wsl.localhost\docker-desktop\mnt\docker-desktop-disk\data\docker\overla…...

每日一题(小白)暴力娱乐篇31

首先分析一下题意&#xff0c;需要求出2024的因子&#xff0c;因为我们要求与2024互质的数字&#xff0c;为什么呢&#xff1f;因为我们要求互质说直白点就是我和你两个人没有中间人&#xff0c;我们是自然而然认识的&#xff0c;那我们怎么认识呢&#xff0c;就是直接见面对吧…...

FastAPI与SQLAlchemy数据库集成

title: FastAPI与SQLAlchemy数据库集成 date: 2025/04/17 15:33:34 updated: 2025/04/17 15:33:34 author: cmdragon excerpt: FastAPI与SQLAlchemy的集成通过创建虚拟环境、安装依赖、配置数据库连接、定义数据模型和实现路由来完成。核心模块包括数据库引擎、会话工厂和声…...

SQL刷题记录贴

1.题目&#xff1a;现在运营想要对用户的年龄分布开展分析&#xff0c;在分析时想要剔除没有获取到年龄的用户&#xff0c;请你取出所有年龄值不为空的用户的设备ID&#xff0c;性别&#xff0c;年龄&#xff0c;学校的信息。 错误&#xff1a;select device_id,gender,age,un…...

消息队列实际结点数与计数器不一致问题分析

问题描述 协议栈 PDCP线程任根据外部消息&#xff0c;维护一个链表式的PDCP PDU消息队列&#xff0c;以及一个变量count来记录消息队列中结点数。 当收到 从NG接口业务数据时&#xff0c;PDCP线程会向PDCP PDU消息队列中添加大量节点&#xff0c;消息队列的count值相应的增加…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月17日第55弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

C++23 新特性:std::size_t 字面量后缀 Z/z

在 C23 中&#xff0c;引入了一个非常实用的新特性&#xff1a;为 std::size_t 类型的字面量提供了新的后缀 Z 和 z。这一改进使得在代码中声明和使用 std::size_t 类型的字面量变得更加直观和便捷。 1. 背景与动机 在之前的 C 标准中&#xff0c;std::size_t 是一种非常常用…...

【裁员感想】

裁员感想 今天忽然感觉很emo 因为知道公司要裁员 年中百分之10 年末百分十10 我知道这个百分20会打到自己 所以还挺不开心的 我就想起 我的一个亲戚当了大学老师 我觉得真的挺好的 又有寒暑假 又不是很累 薪资也不低 又是编制 同时也觉得自己很失败 因为对自己互联网的工作又…...

CSS例子 > 图片瀑布流布局(vue2)

<template><div class"container"><!-- 临时容器用于计算高度 --><div v-if"!isLayoutReady" class"temp-container"><divv-for"(item, index) in list":key"temp- index":ref"(el) > …...

Python 获取淘宝券后价接口的详细指南

在电商领域&#xff0c;淘宝作为国内领先的电商平台&#xff0c;提供了丰富的商品和优惠活动。对于开发者来说&#xff0c;获取淘宝商品的券后价是一个极具价值的功能&#xff0c;可以帮助用户更好地进行购物决策&#xff0c;同时也为相关应用和服务提供了数据支持。本文将详细…...

零服务器免备案!用Gitee代理+GitHub Pages搭建个人博客:绕过443端口封锁实战记录

#GitHub Pages #Gitee代理 #SSH密钥管理 #Jekyll博客 #网络穿透 场景&#xff1a;自己的电脑没有添加github的ssh代理&#xff0c;只有gitee的代理 实现效果&#xff0c;在公网可以运行个人博客。在本地更改内容后公网同步更新。 最开始的模板 最终实现的博客模板&#xff1…...

如何新建一个空分支(不继承 master 或任何提交)

一、需求分析&#xff1a; 在 Git 中&#xff0c;我们通常通过 git branch 来新建分支&#xff0c;这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交&#xff0c;不继承 master 或任何已有内容&#xff0c;这该怎么…...

[终极版]Javascript面试全解

this指向 执行上下文 是代码执行时的运行环境作用域 是变量和函数的可访问性规则&#xff08;静态&#xff09;&#xff1b;全局、函数和块状&#xff1b;内层可访问外层&#xff0c;外层不能访问内层词法环境 是实现作用域的引擎内部机制&#xff08;静态&#xff09; 执行上…...

day30图像处理OpenCV

文章目录 一、图像预处理9. 图像掩膜9.1 制作掩膜9.2 与运算1.原理2.语法 9.3 颜色替换9.4案例 一、图像预处理 9. 图像掩膜 创建的掩膜方便我们对目标区域进行操作。 9.1 制作掩膜 掩膜通常是一个二值化图像&#xff0c;并且与原图像的大小相同。其中目标区域被设置为1&am…...

蓝桥杯 10.拉马车

拉马车 原题目链接 题目描述 小时候你玩过纸牌游戏吗&#xff1f; 有一种叫做 “拉马车” 的游戏&#xff0c;规则简单但非常吸引小朋友。 游戏规则简述如下&#xff1a; 假设参加游戏的小朋友是 A 和 B&#xff0c;游戏开始时&#xff0c;他们得到的随机纸牌序列如下&am…...

Java学习总结-Junit单元测试

单元测试&#xff1a; 就是针对最小功能的单元&#xff1a;方法&#xff0c;编写测试代码对其进行正确性测试。 之前我们怎么测试的&#xff1a;在main方法中调用其他方法&#xff0c;一个方法测试失败可能导致其他方法得不到测试&#xff0c;无法得到测试报告。 Junit单元测…...

代理IP:城市文化IP打造的隐形加速器

目录 一、解码代理IP&#xff1a;数字时代的"变身术" 1.1 工作原理探秘 1.2 主要类型对比 二、城市文化IP的打造密码 2.1 核心要素拆解 2.2 成功案例启示 三、代理IP的五大赋能场景 3.1 文化数据采集 3.2 目标市场定位 3.3 品牌传播突破 3.4 版权保护监控 …...