多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析
多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析
一、TCP粘包问题:成因、影响与解决方案
1. 粘包问题本质
TCP是面向流的协议,数据传输时没有明确的消息边界,导致多个消息可能被合并(粘包)或分割(拆包)。
核心矛盾:应用层“消息”与TCP层“字节流”的语义差异。
典型场景:客户端多次发送小数据(如“Hello”+“World”),TCP可能合并为“HelloWorld”发送,接收端无法区分消息边界。
2. 粘包成因分析
(1)发送端优化(Nagle算法)
- TCP会将小数据包合并发送(Nagle算法默认开启),减少网络报文数量。
- 示例:连续调用
send("A")
和send("B")
,可能合并为一个包“AB”。
(2)接收端缓冲区未及时读取
- 接收端一次读取不完整,剩余数据与新数据混合。
- 示例:发送端发送100字节,接收端仅读取50字节,剩余50字节与下次数据粘连。
(3)底层协议特性
- TCP保证字节流顺序,但不保证消息边界,与UDP的“数据报边界”形成对比。
3. 解决方案对比与实践
(1)消息定长法
- 原理:固定每条消息长度,不足补全(如1024字节)。
- 代码示例(发送端):
char msg[1024] = {0}; strcpy(msg, "Hello"); send(sockfd, msg, 1024, 0); // 固定发送1024字节
- 接收端:每次读取固定长度,直接拆分消息。
- 优缺点:简单直观,但浪费带宽(适合消息长度固定场景,如数据库协议)。
(2)边界标识法
- 长度前缀法(推荐):
- 消息格式:
4字节长度 + 消息内容
。 - 发送端:
char data[] = "HelloWorld"; int len = strlen(data); send(sockfd, &len, 4, 0); // 先发送长度 send(sockfd, data, len, 0); // 再发送内容
- 接收端:
int len; recv(sockfd, &len, 4, 0); // 先读长度 char buff[len]; recv(sockfd, buff, len, 0); // 按长度读内容
- 消息格式:
- 结束符法:
- 消息以固定字符串(如
\r\n
、EOF
)结尾,适用于文本协议(如HTTP、FTP)。
- 消息以固定字符串(如
(3)应用层协议法
- 自定义协议格式:
struct Message { uint32_t type; // 消息类型(4字节) uint32_t length; // 内容长度(4字节) char content[1024]; // 内容 };
- 优势:支持复杂业务逻辑,适用于RPC、即时通讯等场景。
二、多线程服务器:高并发处理实战
1. 代码架构解析
// 多线程服务器核心逻辑(ser.c)
#include <pthread.h>
// 套接字初始化函数
int socket_init() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in saddr = { .sin_family = AF_INET, .sin_port = htons(6000), .sin_addr.s_addr = INADDR_ANY // 绑定所有IP }; bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)); listen(sockfd, 5); return sockfd;
} // 线程处理函数:每个客户端独立线程
void* recv_fun(void* arg) { int c = *(int*)arg; free(arg); // 释放动态分配的套接字描述符内存 while (1) { char buff[128] = {0}; int n = recv(c, buff, 127, 0); if (n <= 0) { // n=0表示客户端关闭,n<0表示错误 close(c); printf("Client %d disconnected\n", c); return NULL; } send(c, "ok", 2, 0); // 简单应答 }
} int main() { int listen_fd = socket_init(); while (1) { int c = accept(listen_fd, NULL, NULL); if (c < 0) { perror("accept"); continue; } // 为每个客户端创建新线程 int* conn_fd = malloc(sizeof(int)); *conn_fd = c; pthread_create(&tid, NULL, recv_fun, conn_fd); pthread_detach(tid); // 分离线程,自动释放资源 }
}
2. 关键细节与陷阱
- 套接字描述符传递:
- 必须动态分配内存(如
malloc
)传递c
,避免栈内存被释放导致野指针。 - 线程处理函数中第一时间
free(arg)
,防止内存泄漏。
- 必须动态分配内存(如
- 线程分离:
- 使用
pthread_detach(tid)
让线程结束后自动释放资源,避免调用pthread_join
阻塞主线程。
- 使用
- 粘包处理:
- 示例代码未处理粘包,实际需结合前文方法(如长度前缀法)解析数据。
三、多进程服务器:稳定性与资源管理
1. 代码架构解析
// 多进程服务器核心逻辑
#include <signal.h>
void signal_wait(int signum) { wait(NULL); // 处理子进程退出,避免僵尸进程
} int main() { int listen_fd = socket_init(); signal(SIGCHLD, signal_wait); // 注册子进程退出信号处理 while (1) { int c = accept(listen_fd, NULL, NULL); pid_t pid = fork(); if (pid < 0) { close(c); continue; } else if (pid == 0) { close(listen_fd); // 子进程关闭监听套接字 while (1) { // 数据处理逻辑(同多线程版本) } close(c); exit(0); } else { close(c); // 父进程关闭连接套接字,由子进程处理 } }
}
2. 多进程 vs 多线程
特性 | 多线程 | 多进程 |
---|---|---|
资源共享 | 共享地址空间(需同步) | 独立地址空间(安全,开销大) |
上下文切换 | 开销小(仅寄存器、栈) | 开销大(地址空间全量切换) |
适用场景 | IO密集型(如网络并发) | CPU密集型(充分利用多核) |
编程复杂度 | 高(同步机制) | 低(天然隔离) |
四、高频问题与最佳实践
1. 粘包问题避坑指南
- 错误做法:依赖
recv
返回值判断消息边界(仅能判断连接是否关闭)。 - 正确姿势:
- 始终假设接收数据不完整,使用循环读取直到获取完整消息。
- 推荐长度前缀法(如
4字节长度+内容
),兼容二进制与文本协议。
2. 多线程服务器性能瓶颈
- 线程数量限制:单进程线程数受限于内存(默认栈大小8MB,1000线程约8GB内存)。
- 优化方案:
- 使用线程池(如
pthread_pool
)复用线程,减少创建销毁开销。 - 设置套接字为非阻塞模式,配合
epoll
实现IO多路复用(适用于海量连接)。
- 使用线程池(如
3. 多进程僵尸进程处理
- 必做操作:
- 注册
SIGCHLD
信号处理函数,或设置signal(SIGCHLD, SIG_IGN)
忽略信号(Linux特有的简单方案)。 - 子进程中务必
close(listen_fd)
,避免端口被意外占用。
- 注册
五、总结:选择合适的并发模型
- 小规模并发(<100连接):多线程/多进程直接处理,代码简单易维护。
- 大规模并发(>1000连接):IO多路复用(
epoll
+非阻塞IO),避免线程/进程爆炸。 - 粘包处理:根据协议类型选择定长法、边界法或应用层协议,优先实现长度前缀格式。
网络编程的核心是“处理不确定性”——不确定的网络延迟、不确定的数据包顺序、不确定的连接状态。通过合理的协议设计和并发模型选择,才能构建健壮的网络服务。
六、常见问题和面试常问点
多线程 TCP 编程中的问题
- 线程安全问题:多个线程可能同时访问共享资源,如全局变量、文件描述符等,需要使用同步机制(如互斥锁、信号量)来保证数据的一致性。
- 资源竞争:线程之间可能会竞争有限的资源,如内存、CPU 时间等,可能导致性能下降或死锁。
- 线程管理:创建和销毁线程会带来一定的开销,过多的线程会导致系统资源耗尽。需要合理管理线程数量,例如使用线程池。
- 粘包问题:TCP 是面向流的协议,可能会出现粘包现象,需要在应用层进行处理,如使用消息定长、边界标识等方法。
- 异常处理:线程中发生的异常需要正确处理,否则可能导致程序崩溃或资源泄漏。
面试常问点
- 多线程和多进程的优缺点比较:多线程共享进程的资源,创建和销毁开销小,但存在线程安全问题;多进程拥有独立的内存空间,稳定性高,但创建和销毁开销大,进程间通信复杂。
- 如何解决线程安全问题:可以使用互斥锁、读写锁、信号量、条件变量等同步机制来保证线程安全。
- 线程池的原理和实现:线程池预先创建一定数量的线程,当有任务到来时,从线程池中取出一个空闲线程来处理任务,任务完成后线程返回线程池。这样可以减少线程创建和销毁的开销。
- 粘包问题的原因和解决方案:粘包问题是由于 TCP 协议的特性导致的,解决方案包括消息定长法、边界标识法和应用层协议法等。
- 信号处理和僵尸进程的处理:在多进程编程中,需要处理子进程结束的信号,避免僵尸进程的产生。可以使用
wait
或waitpid
函数回收子进程的资源,或者忽略SIGCHLD
信号。
相关文章:
多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析
多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析 一、TCP粘包问题:成因、影响与解决方案 1. 粘包问题本质 TCP是面向流的协议,数据传输时没有明确的消息边界,导致多个消息可能被合并(粘包…...
【ArcGISPro】属性规则--属性联动
新建要素 直接点击【完成】 设置全局ID <...
五一感想:知识产权加速劳动价值!
今天是五一劳动节,祝各位网友劳动节快乐,昨天《中华人民共和国民营经济促进法》通过,普推知产老杨看到其中第三十三条专门就是针对知识产权的,加强对民营经济的原始创新保护。 一个普通的小物件白牌可能就卖1元钱,但是…...
ORACLE EBS 12.1 启用https 简单策略
Oracle EBS 启用https的官方文档是Document 376700.1, Enabling TLS in Oracle E-Business Suite Release 12.1,上面各种配置比较繁琐,我们参照Using Load-Balancers with Oracle E-Business Suite Release 12.0 and 12.1 (Doc ID 380489.1) 这个文档来利…...
Sublime PrettyJson 快捷键
一、进入快捷键编辑页 二、添加格式化、去掉格式化 快捷键 [ { "keys": ["ctrlcommandj"], "command": "pretty_json"}, { "keys": ["ctrlcommandm"], "command": "un_pretty_json"}…...
【计算机网络】TCP为什么可靠?解决了哪些问题?
TCP提供了: 1.可靠传输 2.流量控制 3.拥塞控制 4.连接管理 解决了数据在不可靠IP网络上的传输问题。 下面具体分析这4个方面。 1.可靠性传输: TCP确保数据包在网络传输过程中 不丢失、不重复,并且按顺序到达。 通过确认(ACK)、重传机制以…...
AI服务器的作用都有哪些?
根据网络环境的飞速发展,人工智能技术逐渐入驻到各个行业当中,其中AI服务器则是一种专门用来运行人工智能算法和模型的硬件设备,通常具备高性能计算、大容量存储和并行计算等多种功能,本文就来详细讲解一下AI服务器的作用…...
移动应用开发:自定义 View 处理大量数据的性能与交互优化方案
实现 1 万条数据下流畅滑动与灵敏交互的完美平衡。 一、数据渲染优化:从 1 万条到丝滑体验 (一)视图复用机制 视图复用是提升大量数据渲染性能的关键策略。以一个简单的自定义列表视图为例,我们可以构建如下的复用池管理机制&a…...
在 Ubuntu 下使用 ESP-IDF 通过串口烧录 ESP32
1. 准备工作 (1) 安装 ESP-IDF 环境 确保已完成 ESP-IDF 的安装和配置(参考官方文档): bash 复制 下载 git clone --recursive https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh . ./export.sh (2) 连接开发板 通过…...
探索SQLMesh中的Jinja宏:提升SQL查询的灵活性与复用性
在数据工程和数据分析领域,SQL是不可或缺的工具。随着项目复杂度的增加,如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具,不仅支持标准的SQL语法,还引入了Jinja模板引擎的宏功能,极大地提升…...
【Linux】Linux中的调度和切换
一、引入基本概念 在任何的分时操作系统中,其调度都是较为公平的调度。在来回顾一下关于优先级为什么会被限制的问题: Linux为什么调整优先级是要受到限制的呢?? 如果不加限制,将自己进程的优先级调整到非常高…...
.NET 通过回调函数执行 Shellcode启动进程
在红队活动往往需要考虑如何在实际环境中绕过防御机制,启动木马进程。今天,我们将深入探讨一种较少被提及但非常有趣的技术——利用 EnumPwrSchemes 函数回调来执行shellcode。 0x01 EnumPwrSchemes函数 EnumPwrSchemes 是 Windows 操作系统中的一个 API 函数,位于 C:\Win…...
快速体验 .NET9 提供的 HybridCache 混合缓存
.NET 9 引入了 HybridCache,这是一个新的高性能、分布式就绪的内存缓存实现,旨在为现代 Web 应用提供更高效的数据缓存机制。它结合了本地缓存(如 IMemoryCache)和分布式缓存(如 Redis、Garnet、SQL Server)…...
使用docker配置Mysql
Docker 命令 下面是一个常用的 Docker 命令,用于启动 MySQL 容器,并将数据挂载到本地目录: docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORDyourpassword \-e MYSQL_DATABASEyourdb \-e MYSQL_USERyouruser \-e MYSQL_PASSWOR…...
stm32之输出比较OC和输入捕获IC
目录 1.输出比较OC1.1 简介1.2 PWM简介1.3 输出比较通道1.3.1 通用定时器1.3.2 高级定时器 1.4 PWM基本结构1.6 舵机1.7 直流电机1.7.1 引入:MX1508 芯片1.7.2 TB6612芯片 1.8 结构体和API1.8.1 结构体1.8.2 API1. TIM_OC1Init / TIM_OC2Init / TIM_OC3Init / TIM_O…...
为什么Transformer推理需要做KV缓存
一、我们先来回忆一下在transformer中KV在哪里出现过,都有什么作用? α的计算过程: 这里引入三个向量: 图中的q为Query,用来匹配key值 图中的k为key,用来被Query匹配 图中的Value,是用来被进行加权平均的 由…...
Stream和Collections工具类
Stream流 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流,流在管道中传输&am…...
结合Hutool 突增突降检测的算法
在 Hutool 中虽然没有直接提供“突增突降检测”的算法,但可以通过其提供的工具类(如 CollUtil、ArrayDeque、MathUtil 等)结合滑动窗口、差分分析等方法,快速实现突增突降检测逻辑。以下是基于 Hutool 的实现思路和示例代码&#…...
java springboot deepseek流式对话集成示例
1.直接上代码-后端: RestController CrossOrigin(origins "*") public class DeepSeekController {private static final String API_URL "https://api.deepseek.com/v1/chat/completions";private final ObjectMapper objectMapper new Ob…...
技术对暴力的削弱
信息时代的大政治分析:效率对暴力的颠覆 一、工业时代勒索逻辑的终结 工厂罢工的消亡 1930年代通用汽车罢工依赖工厂的物理集中、高资本投入和流水线脆弱性,通过暴力瘫痪生产实现勒索。 信息时代企业分散化、资产虚拟化(如软件公司可携带代码…...
RAG框架搭建(基于Langchain+Ollama生成级RAG 聊天机器人)
目录 一 Ollama安装 Windows 系统安装 验证安装 二 Langchain安装 2.1 先创建一个虚拟环境 2.2 安装最新版 langchain 三 基于 Langchain私有模型,构建一个生成级RAG 聊天机器人 3.1 初始化LLM 3.2 增强生成 3.3生成嵌入 3.4 生成并存储嵌入 一 Ol…...
spring cloud gateway(网关)简介
Spring Cloud Gateway 是一个基于 Spring WebFlux 构建的强大且广泛使用的 API 网关。它负责处理所有进入的请求,并将它们路由到相应的后端服务。 Gateway 的主要作用: 统一的入口点 (Single Entry Point): 它为所有的客户端请求提供了一个…...
webrtc 视频直播
webrtc 是一种开源的音视频通信技术,可以不借助中间媒介建立浏览器点对点(peer-to-peer)连接,实现音视频以及其他数据的传输。webrtc具有平台兼容性,低延迟与高实时的优点。今天主要记录一下webrtc的使用记录ÿ…...
【Elastsearch】如何获取已创建的api keys
在Elasticsearch中,可以通过API获取已创建的API密钥(API keys)。以下是具体步骤和示例: 1.使用GET请求获取API密钥 Elasticsearch提供了GETAPI,用于列出当前用户可以访问的所有API密钥。 请求格式 plaintext GET /_se…...
AI Agent开发第57课-AI用在销售归因分析场景中-用随机森林从0构建自己的“小模型”
开篇 在前一篇《机器学习的基础-线性回归如何应用在商业场景中》里,我们说到了如果我们只是简单的分析和预测一下投入广告费用和销售额增长是否存在必然关系,我们用了线性回归法得到了分析,得到的分析结果极其精准,以及提到了:如果当销售因素是非线性的并且有着额外一些如…...
Elasticsearch知识汇总之ElasticSearch部署
五 ElasticSearch部署 部署Elasticsearch,可以在任何 Linux、MacOS 或 Windows 机器上运行 Elasticsearch。在Docker 容器 中运行 Elasticsearch 。使用Elastic Cloud on Kubernetes 设置和管理 Elasticsearch、Kibana、Elastic Agent 以及 Kubernetes 上的 Elasti…...
高等数学第五章---定积分(§5.4反常积分)
5.4 反常积分 前面我们学习了定积分 ∫ a b f ( x ) d x \int_a^b f(x) d x ∫abf(x)dx,其中积分区间 [ a , b ] [a, b] [a,b] 是有限区间,且被积函数 f ( x ) f(x) f(x) 在 [ a , b ] [a, b] [a,b] 上是连续的(或至多有有限个第一类间…...
UE5 ML机械学习肌肉反应与布料反应
在查找Ai过渡动画的过程中,通过米哈游鹿鸣的展示,了解到的机械学习技术 https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-the-machine-learning-deformer-in-unreal-engine#%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6 https://dev.epicgames.com/documentati…...
UE5 诺伊腾动捕使用笔记
AxisStudio使用说明 诺伊腾动捕有两个软件,分别是AxisStudio和Axis Post 打开软件后选择"工程" 分为两种工程,一种是PN Studio和PN3,这两个工程对于不同的骨骼方式(也可以修改) 以PNStudio的2.0-Carwheel举例 右侧的数据为你的目标骨骼的尺寸,例如我现在是Metahuma…...
【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本(非常简洁快速)
【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&…...
在sheel中运行Spark
RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。 Dataset: 一个数据集合…...
如何从windows中的cursor打开windows里面的wsl中的项目
解决方法: ✅ 步骤 1:在 Windows 中安装 Cursor 首先,确保你已在 Windows 上安装了 Cursor 编辑器。 安装完成后,打开 Cursor 编辑器。 ✅ 步骤 2:安装并配置 WSL 扩展 为了让 Cursor 与 WSL 集成,需…...
UE5 C++项目实现单例
在 UE5 中,要实现“全局只有一个实例”的单例模式,主要有两种思路:一种是传统 C++ 静态单例,另一种是利用 UE5 提供的Subsystem体系(如 UGameInstanceSubsystem、UWorldSubsystem 等)。下面先给出核心示例代码及对比,随后讨论典型使用场景、优缺点,对常见问题作出诊断并…...
信息论04:从信息熵到互信息——信息共享的数学度量
从信息熵到互信息:信息共享的数学度量 1. 信息论基础概念 1.1 信息熵(Information Entropy) 定义:信息熵由香农提出,用于量化随机变量的不确定性。对于离散随机变量X,其熵定义为: H ( X ) …...
MYSQL的DDL语言和单表查询
MYSQL的DDL语言和单表查询 Mysql介绍 SQL(Structured Query Language)是一种专门用于管理和操作关系型数据库的标准化语言,通过定义、查询、更新和控制数据,为应用程序提供一致且高效的持久化存储方式。它包含数据定义语言&…...
奇瑞依托汽车产业链,实现服务机器人万台下线
近日,奇瑞集团旗下墨甲机器人(MOJA)全球批量交付的消息得到官方确认。这一重大进展不仅标志着奇瑞在服务机器人领域的商业化落地迈出关键一步,更成为国产智能装备进军全球市场的重要里程碑。 墨甲机器人简介 产品定位 墨甲是奇…...
Python Bug 修复案例分析:函数参数传递引发的逻辑错误修复
在 Python 编程学习的过程中,各种意想不到的 Bug 常常会阻碍我们编写的程序的正常运行。这次,我们将围绕一个因函数参数传递导致逻辑错误的案例,深入剖析 Bug 的修复全过程,帮助初学者掌握处理这类问题的方法。 案例背景 最近编写…...
论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors
RoboGround 论文 一类中间表征是语言指令,但对于空间位置描述过于模糊(“把杯子放桌上”但不知道放桌上哪里);另一类是目标图像或点流,但是开销大;由此 GeoDEX 提出一种兼具二者的掩码。 相比于 GR-1&#…...
deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23
目录 0、简介1、下载链接1.1、CSDN链接,含权重文件直接使用,建议直接下这个,还不限速。1.2 Github链接: 2、下载代码,下载预训练好的权重3、预测代码4、像素提取,或者说类别提取5、文档部分内容截图6、其他…...
JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧
JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧 引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方…...
第2章——springboot核心机制
一、为何以继承方式引入SpringBoot 1.提出疑问 以前我们在开发项目时,需要什么,引入对应的依赖就行,比如我们需要连接mysql数据,则引入mysql驱动的依赖,如下: <dependency><groupId>com.mys…...
huggingface 热门开源TTS模型Dia-1.6B,支持多人对话生成、情感控制~
简介 Dia-1.6B 是一款由 Nari Labs 开发的开源文本转语音(TTS)模型,专注于生成自然对话。其项目背景和模型架构基于近期可用的网络信息进行了详细分析,以下是全面的报告。 项目背景概述 Dia-1.6B 的开发始于 Nari Labsÿ…...
深入理解West:介绍、使用及与Repo的对比
目录 引言 West简介 West的由来 West的核心功能 West的架构与工作流程 West安装与使用 环境准备与安装 Manifest 文件结构解析 常用命令详解与进阶用法 Tip与Troubleshoot 实践案例:基于West的Zephyr项目管理 初始化与同步 构建与闪存 插件示例:自定义命令 Repo简介 Repo的背…...
力扣-hot100 (矩阵置零)
73. 矩阵置零 中等 给定一个 *m* x *n* 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示…...
OpenKylin安装Elastic Search8
一、环境准备 Java安装 安装过程此处不做赘述,使用以下命令检查是否安装成功。 java -version 注意:Elasticsearch 自 7.0 版本起内置了 OpenJDK,无需单独安装。但如需自定义 JDK,可设置 JAVA_HOME。 二、安装Elasticsearch …...
【JVM】从零开始深度解析JVM
本篇博客给大家带来的是JVM的知识点, 重点在类加载和垃圾回收机制上. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 …...
制造企业PLM系统成本基准:2025年预算分配与资源成本率的5种优化模型
在 2025 年制造业数字化转型的浪潮中,PLM(产品生命周期管理)系统已成为制造企业提升核心竞争力的关键工具。然而,PLM 系统的实施和运营成本较高,如何有效控制成本、优化预算分配和资源成本率,成为企业关注的…...
【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`
摘要 昨天, 我在让一个小朋友给我整理一次培训的视频的时候,我看到他把视频文件放到剪映里面处理。 我以为他要干什么呢, 还很期待,结果他只是为了导出音频而已。 于是就有了今天的这篇博客。 作为音视频处理领域的常用需求&…...
Golang领域Beego框架的中间件开发实战
在Golang的Beego框架中,中间件(Middleware)是一种强大的机制,用于在请求处理的不同阶段插入自定义逻辑。 中间件可以用于处理日志记录、身份验证、错误处理、请求/响应修改等任务。 Beego框架中间件开发的实战指南: …...