Golang 的 GMP 调度机制常见问题及解答
文章目录
- Golang GMP 调度模型详解
- 常见问题
- 基础概念
- 1. GMP 各组件的作用是什么?
- 2. 为什么 Go 需要自己的调度器?
- 3. GOMAXPROCS 的作用是什么?
- 调度流程
- 4. Goroutine 如何被调度到 M 上执行?
- 5. 系统调用会阻塞整个线程吗?
- 6. 什么是自旋线程(Spinning Thread)?
- 高级特性
- 7. Work Stealing 如何提升性能?
- 8. Go 如何实现抢占式调度?
- 9. 全局队列 vs. 本地队列的优势?
- 10. Goroutine 泄露会导致什么问题?
- 11. 如何诊断调度器瓶颈?
- 12. 为什么 Goroutine 比线程更高效?
- 实战场景
- 13. GOMAXPROCS 设为 1 会发生什么?
- 14. 大量 Goroutine 卡在 channel 会怎样?
- 15. 如何优化高并发下的调度性能?
- csview 中有关 GMP 调度机制的八个问题
- 1. 简单介绍 GMP 模型?
- 2. 简述 GMP 的调度流程?
- 3. P 和 M 的个数?
- 4. P 和 M 何时被创建?
- 5. 简述 goroutine 的创建流程?
- 6. goroutine 何时会被挂起?
- 7. 同时启动了一万个 goroutine,会如何调度?
- 8. goroutine 内存泄露和处理办法?
Golang GMP 调度模型详解
Golang 的 GMP 调度模型是 Go 语言高并发能力的核心设计,由以下三个组件组成:
- G(Goroutine):轻量级用户态线程,所占用的内存更小(初始 2 KB),由 Go 运行时管理。
- M(Machine):操作系统线程(OS Thread),负责执行 Goroutine,与内核线程一一对应。
- P(Processor):逻辑处理器,管理 Goroutine 队列(本地队列),充当 M 和 G 的调度上下文。
核心机制:
- 协作式调度:Goroutine 会主动让出资源(如通过 channel 阻塞或函数调用时);
- 抢占式调度:通过系统信号抢占长时间运行的 G;
- Work Stealing:当 P 的本地队列为空时,从其它 P 或全局窃取 G;
- Hand Off 机制:当 G 阻塞时,M 释放 P 给其它 M 使用,避免资源浪费。
常见问题
基础概念
1. GMP 各组件的作用是什么?
G 是轻量级的用户态线程,是执行任务的最小单元;M 是操作系统级别的线程,是实际执行 G 的线程;P 是逻辑处理器,用于管理 G 的队列,并负责提供调度上下文。
2. 为什么 Go 需要自己的调度器?
因为传统的操作系统级线程切换成本高(需要由用户态切换到内存态度),GMP 模型通过用户态调度、复用线程并减少锁竞争,支持百万级 Goroutine 并发。
3. GOMAXPROCS 的作用是什么?
设置 P 的数量(默认等于 CPU 核数),决定并行执行的 Goroutine 数量。
调度流程
4. Goroutine 如何被调度到 M 上执行?
P 将本地队列中的 G 绑定到 M,若本地队列为空,则 P 从全局队列窃取或创建新的 G。
5. 系统调用会阻塞整个线程吗?
会,但 Go 的 GMP 调度机制会将 M 与 P 解绑,P 将被分配到空闲的 M 或新创建的 M,避免 G 阻塞。
6. 什么是自旋线程(Spinning Thread)?
M 在寻找可用的 G 时不进入休眠,而是循环检查队列,减少唤醒延迟,但会占用 CPU。
高级特性
7. Work Stealing 如何提升性能?
通过分散调度压力,避免单个 P 的队列成为瓶颈,提升多核利用率。
8. Go 如何实现抢占式调度?
通过向 M 发送 SIGURG
信号,触发调度器检查并抢占运行过久的 G。
9. 全局队列 vs. 本地队列的优势?
全局队列公平但加锁,本地队列无锁但可能导致负载不均,Work Stealing 弥补了这一点。
10. Goroutine 泄露会导致什么问题?
M 和 P 资源占用增加,可能导致程序内存耗尽或调度延迟升高。
11. 如何诊断调度器瓶颈?
使用 go tool trace
查看调度延迟,或通过 GODEBUG=schedtrace=1000
输出调度信息。
12. 为什么 Goroutine 比线程更高效?
Goroutine 的栈可动态扩容,线程切换由用户态调度,避免了从用户态陷入到内核态的上下文切换开销。
实战场景
13. GOMAXPROCS 设为 1 会发生什么?
所有 Goroutine 串行执行,无法利用多核,但并发逻辑仍可通过调度正常运行。
14. 大量 Goroutine 卡在 channel 会怎样?
调度器会将阻塞的 G 移出 M,M 继续执行其它 G,但过多的阻塞 G 会增加调度开销。
15. 如何优化高并发下的调度性能?
减少锁竞争(如使用局部变量)、避免过度阻塞操作、调整 GOMAXPROCS 或拆分任务。
csview 中有关 GMP 调度机制的八个问题
1. 简单介绍 GMP 模型?
G(Goroutine):是 Golang 中协程 Goroutine 的缩写,相当于操作系统中的进程控制块。G 当中存放着 goroutine 运行时的栈信息、CPU 的一些寄存器状态以及执行的函数指令等。
M(Machine):代表一个操作系统的主线程,是对内核现成的封装,M 的数量对应于真实的 CPU 数。一个 M 直接关联一个 OS 内核线程,用于执行 G。M 会优先从关联的 P 的本地队列中直接获取待执行的 G。
P(Processor):代表了 M 所需要的上下文环境,保存着 M 运行 G 所需要的全部资源。P 是处理用户级代码逻辑的处理器,可以将其看作一个局部调度器,使得 Golang 代码块可以在操作系统线程上运行。当 P 上有任务时,就需要创建或唤醒一个系统线程来执行其本地队列当中的任务,所以 P 和 M 是相互绑定的。
2. 简述 GMP 的调度流程?
- 每个 P 都有局部队列,局部队列保存待执行的 goroutine,当 M 绑定的 P 的局部队列已满时,新追加的 goroutine 就会被放到全局队列。
- 每一个 P 都和 M 绑定,M 是真正执行 P 中 goroutine 的实体,M 会从其所绑定的 P 当中获取 G 来执行。
- 当 M 绑定的 P 的局部队列为空时,M 会从全局队列获取 goroutine 并转移到本地队列来执行 G,当从全局队列仍然没有可执行的 G 时,M 会从其它 P 的本地队列中偷取(Work Stealing)G 来执行。
- 当 G 因系统调用(syscall)阻塞时,会阻塞 M,此时 P 会和 M 解绑(hand off),并寻找新的空闲的 M,若没有空闲的 M,就会新建一个 M(模糊点:需要注意的是,此时 P 与 M 解绑并与新的 M 绑定,继续执行 P 中其它可执行的 G,因为之前的 G 因系统调用将 M 阻塞了。当之前的 G 系统调用完成并恢复之后,被阻塞的 G 会被直接放回原 P 的本地队列,若原来的 P 已经被占用,则将 G 放入全局队列。位于全局队列当中的 G 可以通过 work stealing 被其它 P 窃取)。
- 当 G 因 channel 或 network I/O 阻塞时,不会阻塞 M,M 会寻找其它可执行的 G。当阻塞的 G 恢复后会重新进行可执行状态并进入 P 队列等待执行。
3. P 和 M 的个数?
- P:由启动时环境变量
GOMAXPROCS
决定。这意味着程序执行的任意时刻都只有GOMAXPROCS
个 goroutine 在同时执行。 - M:Go 程序启动时,会设置 M 的最大数量,默认为 10000,但内核很难支持这么多的线程数,所以这个限制可以忽略;一个 M 阻塞时,会创建新的 M。
总结
M 与 P 的数量没有绝对关系,一个 M 阻塞,P 就会去寻找空闲的 M,如果没有空闲的 M,那么就创建一个新的 M。因此,即使 P 的默认数量为 1,也有可能创建很多个 M 出来。
4. P 和 M 何时被创建?
P:在确定了 P 的最大数量 n
后,运行时系统会创建 n
个 P。
M:在没有足够的 M 来关联 P 并运行其中的 G 时,会创建新的 M 并关联 P。正如上文所提到的,假设当前所有 M 都由于 G 需要系统调用而阻塞了,而 P 当中还有很多就绪的 G,那么就会创建新的 M 来与 P 绑定。
5. 简述 goroutine 的创建流程?
调用 go func()
时,会调用 runtime.newproc
来创建一个 goroutine,这个 goroutine 有自己的栈空间,同时在 G 的 sched 中维护栈地址与程序计数器信息(即调用 go func()
之后,创建一个 goroutine 并维护 goroutine 运行所需要的状态,比如栈空间以及程序计数器信息)。
创建好的 goroutine 会被放到它对应的内核线程 M 所使用的上下文 P 的 run_queue 中(如果 run_queue 已满,则保存至其它 P 的 run_queue,如果所有 P 的 run_queue 都满了,那么送至全局队列),等待 GMP 调度器决定这个 G 何时取出并执行(又分为两种情况,可能顺序等待自己的 P 调度执行,也可能触发 work stealing 由其它 M 执行)。
6. goroutine 何时会被挂起?
宏观上来说分为两种情况,分别是 goroutine 触发系统调用阻塞,以及 goroutine 等待 channel 或 network I/O。
触发系统调用而阻塞时,G 的 M 会被阻塞,此时与 M 绑定的 P 会寻找一个空闲的 M(无空闲 M 时创建一个新的 M),并取出当前处于就绪态的 G 执行。刚才触发系统调用的 G 在结束系统调用后,被阻塞的 M 会进入休眠状态,等待下一次被唤醒,G 会尝试放入原来 P 的本地队列,如果 P 的本地队列已满,则 G 被放入全局队列。位于全局队列中的 G 会通过 work stealing 机制被其它 P 窃取。
当 goroutine 等待 channel 或 network I/O 而阻塞时,不会阻塞 M,此时 M 会立即取出 P 中其它空闲的 G 执行。当前阻塞的 G 在就绪时会优先放入原来 P 的本地队列当中,否则将 G 放入全局队列。
7. 同时启动了一万个 goroutine,会如何调度?
一万个 G 会按照 P 的设定个数,尽可能平均地分配到每个 P 的本地队列当中。如果所有本地队列都已满,那么就放入 GMP 的全局队列当中。接下来开始执行 GMP 模型的调度策略:
- 本地队列轮转:每一个 P 都维护着一个保存着 G 的本地队列。不考虑 G 进行系统调用和 I/O 情况下的阻塞,P 会周期性地从本地队列中调度 G 到 M 执行,执行一段时间后将 G 的上下文保存起来并插入到队尾,再从队首调度 G 执行;
- 系统调用:P 的个数默认等于 CPU 的核数,每一个 M 必须与 P 绑定才能够运行 P 队列当中的 G。通常来说,运行时 M 的个数会略大于 P 的个数,原因是当 G 触发系统调用时,M 会被阻塞,此时与 M 绑定的 P 会触发 hand off 机制与 M 解绑,并寻找一个新的空闲的 M1 并与之绑定,继续执行这个 P 中就绪的 G。被阻塞的 M 就绪时,会进入休眠状态,等待下一次与 P 绑定。
- 工作量窃取:多个 P 中维护的 G 队列可能是不平衡的,当某个 P 执行完了全部本地队列当中的 G,就会去查询全局队列,如果全局队列在无 G,那么就从另一个 P 的本地队列当中窃取 G 并执行。一般来说每次窃取一半。
8. goroutine 内存泄露和处理办法?
Goroutine 内存泄漏是指程序中启动的 goroutine 由于某些原因无法正常退出,从而长期占用了内存和资源,最终导致程序内存耗尽或性能下降。
预防 Goroutine 泄露的最佳实践
- 始终为阻塞操作设置超时(如 channel、I/O 请求,可以通过 select + time.After 来完成);
- 使用
context
传递取消信号,确保 goroutine 可以及时退出; - 优先使用带 buffer 的 channel,避免无缓存 channel 的意外阻塞;
- 通过
defer
关闭资源; - 定期检查 goroutine 的数量,结合监控工具预警异常增长(比如
pprof
和go tool trace
)
相关文章:
Golang 的 GMP 调度机制常见问题及解答
文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么?2. 为什么 Go 需要自己的调度器?3. GOMAXPROCS 的作用是什么? 调度流程4. Goroutine 如何被调度到 M 上执行?5. 系统调用会阻塞整个线程吗࿱…...
使用VSCODE导致CPU占用率过高的处理方法
1:cpptools 原因:原因是C/C会在全局搜索文件,可以快速进行跳转;当打开的文件过大,全局搜索文件会占用大量CPU; 处理方法: 1:每次只打开小文件夹; 2:打开大文…...
17--华为防火墙智能选路全解:网络世界的智能导航系统
华为防火墙智能选路全解:网络世界的智能导航系统 开篇故事:快递小哥的烦恼与网络世界的相似性 想象你是个快递站站长,每天要处理来自全国各地的包裹。突然某天遇到: 🚚 双11爆仓:如何把包裹最快送到客户手…...
CSS-BFC(块级格式化上下文)
一、BFC 的本质理解(快递仓库比喻) 想象一个快递分拣仓库(BFC容器),这个仓库有特殊的规则: 仓库内的包裹(内部元素)摆放不影响其他仓库包裹必须整齐堆叠,不能越界不同仓…...
Java 大视界 -- Java 大数据在智慧港口集装箱调度与物流效率提升中的应用创新(159)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划|文献速递-医学影像人工智能进展
Title 题目 ZygoPlanner: A three-stage graphics-based framework for optimal preoperative planning of zygomatic implant placement ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划 01 文献速递介绍 1.1 研究背景 颧…...
【2.项目管理】2.4 Gannt图【甘特图】
甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...
python学习笔记(1)
为什么要学python 目前在研究网站的搭建,想通过python搭建一个我的世界资源买卖的平台,然后就开始研究python了,其实这不是我第一次研究python了,之前学的都不咋样,现在温故而知新,好好研究一下python。 Python的变量 在此之前先简单的介绍一下变量,给第一次接触的小…...
刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
在金融科技高速发展的今天,股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口,帮助用户快速获取实时或历史市场数据,为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...
2025 年吉林省燃气企业从业人员考试:实用备考攻略与考试提分要点
2025 年吉林省燃气企业从业人员考试报名通过吉林燃气行业管理系统。报名资料包含企业的环保达标证明(燃气行业涉及环保要求)、个人的岗位任职证明等。实用备考攻略是,关注吉林在燃气分布式能源系统建设方面的进展,结合《燃气冷热电…...
dubbo http流量接入dubbo后端服务
简介 dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题: 多协议发布【推荐】,为dubbo协议服务暴…...
自动驾驶04:点云预处理03
点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…...
小程序中过滤苹果设备中的表情(即 emoji)
在小程序中过滤苹果设备中的表情(即 emoji),通常需要考虑以下几个方面:识别 emoji、处理用户输入、以及在显示或存储时进行过滤。以下是具体的实现思路和步骤: 1. 理解苹果中的表情(Emoji) 苹果…...
软件性能测试中的“假阳性”陷阱
软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…...
现代优雅品牌杂志包装徽标设计衬线英文字体安装包 Relish – Aesthetic Font
CS Relish – 美学字体:优雅与现代简约的结合 永恒的现代 Serif 字体 CS Relish 是一种现代衬线字体,将极简主义美学与精致精致融为一体。凭借其时尚、干净的字体和平衡的结构,它给人一种优雅和现代的印象。这款字体专为那些欣赏微妙和优雅的…...
《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略
正在学习或者是使用 Oracle 数据库的小伙伴,是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢?而且即使是手动去开关也显得即为麻烦,所以基于我之前所学习到的方法,我在此重新整理,让大家动动手指就能完成开…...
《寒门枭雄传》章回目录与核心故事设计(36回)
《寒门枭雄传》章回目录与核心故事设计(36回) 主线:寒门崛起→权力异化→制度轮回 核心冲突:个人奋斗 vs 制度性压迫 第一卷京口草鞋摊的野望(第1-12回) 主题:寒门之困始于生存,终…...
C语言学习笔记(抱佛脚版)
毕业一年,发现记性是真的差,每次想起之前的知识总是想不全,看别人写的资料也懵懵懂懂。于是我索性自己再学一遍,并且记录一下。希望对你们也有所帮助。 正片开始! 前面的什么if for都不难理解,嵌套的话也…...
DeepSeek-V3-0324 模型发布:开源 AI 性能再攀高峰,推理与编码能力逼近顶级闭源模型
2025 年 3 月 24 日,国内 AI 公司深度求索(DeepSeek)悄然推出 V3 模型的升级版本 DeepSeek-V3-0324。尽管此次更新并非市场期待的 V4 或 R2 版本,但其在推理速度、编码能力、数学推理及开源生态上的突破,仍迅速引发全球…...
清晰易懂的Cursor实现AI编程从安装到实战TodoList开发
一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…...
(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门
引言 AVFoundation 是 Apple 提供的强大多媒体框架,支持音视频播放、录制、处理等功能。在 iOS 开发中,AVFoundation 是实现视频播放的核心技术之一。 本篇文章将简单介绍如何使用 AVPlayer、AVPlayerItem 和 AVPlayerLayer 进行视频播放,并…...
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案! 稳联技术Profinet转CANopen网关应运而生——它如同一座智能桥梁☺,打通两大主流工业协议,让异构网络无缝互联,助您释放设备潜力,实现真正的“万物互联”&…...
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
问题描述 在Linux安装conda下的python环境时候,修改了~/.bashrc文件,修改完成后,再次进入服务器后,登录时候显示的不是正常的[rootlocalhost ~]#,而是-bash-4.2# 原因分析: 网上原因有:/root下…...
关于deepseek
DeepSeek:领先的人工智能研究与创新公司 公司简介 DeepSeek(深度求索)是一家专注于人工智能(AI)技术研发的创新公司,致力于推动大模型、自然语言处理(NLP)、机器学习(M…...
EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路
一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…...
李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念
机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值:label MAE MSE 几率分布,cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小,找导数为零的点 单独考虑w,w…...
RAG生成中的多文档动态融合及去重加权策略探讨
目录 RAG生成中的多文档动态融合及去重加权策略探讨 一、RAG生成概述 二、多文档动态融合策略 1. 拼接与分段编码 2. 独立编码与后续融合 3. 基于查询的动态加权 三、检索结果的去重与加权策略 1. 去重策略 2. 加权策略 四、实践中的挑战与思考 五、结语 RAG生成中的…...
对匿名认证的理解
概述:在 Spring Security 中,** 匿名认证(Anonymous Authentication)** 是一种特殊的认证机制,用于处理未提供有效凭证的请求。 匿名认证的本质 目的:允许未认证用户访问特定资源。原理: 当请求…...
leetcoed0044. 通配符匹配 hard
1 题目:通配符匹配 官方难度:难 给你一个输入字符串 (s) 和一个字符模式 ( p ) ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序…...
航拍数据集汇总,覆盖车辆/船舶检测/物体评估/城市景观……
随着无人机的普及化和计算机视觉技术的迅猛发展,无人机航拍作为一种创新的摄影方式,正以前所未有的速度走进大众视野。它打破了传统拍摄的局限,为我们开启了「上帝视角」。航拍硬件性能逐渐逼近物理极限,算法优化的难度也日益增大…...
【SECS】初识SECS协议
【SECS】初识SECS协议 基本知识流和功能函数数量官方文件中缩写标注正常是不是都是主机向设备端?对数据信息中第1字节第1-2位官网介绍 S1F1双向指令说明测试H发起端E发起端 参考资料 基本知识 SECS(SEMI Equipment Communications Standard)即半导体设…...
RL基础以及AlphaGo、AlphaGo Zero原理
RL基础 Q价值函数和状态价值函数 Action-Value function: Q ( s , a ) Q(s, a) Q(s,a)是agent在状态s下执行某一个动作(如向上走),所获得的及时奖励和未来折扣的累计奖励 State-Value function: V ( s ) V(s) V(s)是…...
Android R adb remount 调用流程
目的:调查adb remount 与adb shell进去后执行remount的差异 调试方法:添加log编译adbd,替换system\apex\com.android.adbd\bin\adbd 一、调查adb remount实现 关键代码:system\core\adb\daemon\services.cpp unique_fd daemon_service_to…...
uvm sequence
UVM Sequence 是验证环境中生成和控制事务(Transaction)流的核心机制,它通过动态生成、随机化和调度事务,实现灵活多样的测试场景。以下是Sequence的详细解析: Sequence 的核心作用 事务流生成:通过 uvm_s…...
Java 代理(一) 静态代理
学习代理的设计模式的时候,经常碰到的一个经典场景就是想统计某个方法的执行时间。 1 静态代理模式的产生 需求1. 统计方法执行时间 统计方法执行时间,在很多API/性能监控中都有这个需求。 下面以简单的计算器为例子,计算加法耗时。代码如下…...
《初级社会工作者》考试题,附答案解析
一、单项选择题(共 60 题,每题 1 分) 1. 社会工作者在社区中开展针对留守儿童的支持小组活动,发现一名儿童因父母长期外出务工而产生严重的分离焦虑。此时,社会工作者应首先采取的介入策略是( )…...
网盘解析工具1.3.0,修改了一些bug,建议更新到此版本
最近问题反馈比较多,本来想着周末再更新了来着,但是账号黑的实在太快了。排查了下应该是某度网盘的一个接口缺少了一些参数,导致一直进黑名单。所幸参数不难找,新版本已经修复了,建议大家赶紧更新到1.3.0版本ÿ…...
Multi-Stage Progressive Image Restoration论文阅读
摘要 图像复原任务在恢复图像时需要在空间细节与高层语境化信息之间取得复杂的平衡。本文提出了一种新颖的协同设计方法,能够最优地平衡这些竞争目标。我们的核心方案是一种多阶段架构,通过逐步学习退化输入的复原函数,将整体恢复过程分解为…...
了解图像质量评价指标PSNR
一、PSNR是什么 1.1 定义与数学公式 峰值信噪比(Peak Signal-to-Noise Ratio,PSNR)是数字图像处理领域最经典的客观质量评价指标之一。其核心思想是通过计算原始图像与失真图像之间的均方误差(MSE)来衡量失真程度&am…...
C++概述
1 什么是面向对象】 概念上来说:就是以对象(具体的变量)为导向的编程思路 专注于:一个对象具体能实现哪些过程(哪些功能) 面向对象 n * 面向过程 结论:面向对象需要做的事情 1:我们要想清楚,我们现在需要编写一个…...
axios文件下载使用后端传递的名称
java后端通过HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要设置Access-Control-Expose-Headers,代表跨域该Content-Disposition返回Header可读,如果没有,前端是取不到Content-Disposition的,可以在统…...
如何让 history 记录命令执行时间?Linux/macOS 终端时间戳设置指南
引言:你真的会用 history 吗? 有没有遇到过这样的情况:你想回顾某个重要命令的执行记录,却发现 history 只列出了命令序号和内容,根本没有时间戳?这在运维排查、故障分析、甚至审计时都会带来极大的不便。 想象一下,你在服务器上误删了某个文件,但不知道具体是几点执…...
使用LLaMAFactory微调Qwen大模型
一、环境配置与工具安装 1. 硬件要求 GPU:至少1块NVIDIA GPU(推荐RTX 4090/A100/H100,显存≥16GB)。内存:≥64GB系统内存。存储:≥100GB硬盘空间用于模型与数据集存储。2. 软件依赖 Python 3.8+:需安装CUDA支持的PyTorch版本(如torch==2.0.1+cu117)。 依赖库:通过以…...
CSS3:现代Web设计的魔法卷轴
一、布局革命:从平面到多维空间 1.1 Grid布局的次元突破 星际战舰布局系统 .galaxy {display: grid;grid-template-areas: "nav nav nav""sidebar content ads""footer footer footer";grid-template-rows: 80px 1fr 120p…...
Netty - 从Nginx 四层(TCP/UDP)流量中获取客户端真实/网络出口IP
文章目录 一、背景与原理1.1 问题场景网络架构影响分析1.1 客户端与Nginx之间存在的NAT/VPN1.2 Nginx与RPC服务之间的NAT 1.2 技术原理 二、环境配置验证2.1 Nginx配置2.2 版本要求 三、Netty服务端实现3.1 Pipeline配置(核心代码)3.2 协议处理器实现3.3…...
基于Spring AI开发本地Jenkins MCP Server服务
前言 首先介绍下MCP是什么? MCP是由开发了 Claude 模型的 Anthropic 公司2024年12月提出并开源的一项开放标准,全称:Model Context Protocol,它是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…...
记录一次TDSQL事务太大拆过binlog阈值报错
记录一次TDSQL事务太大拆过binlog阈值报错处理过程 1、排查任何类型数据库故障的第一步, 同步实例信息、报错内容、报错时间段、当前是否恢复、如何感知到数据库问题的、对应用有什么影响、系统允许的时间窗口。 2、明确报错内容为单次写入binlog量超过阈值 3、登陆…...
1688商品详情接口:深度解析与应用实践
在电商领域,1688作为中国领先的B2B平台,拥有海量的商品信息。对于开发者、商家和数据分析师来说,获取1688商品的详细信息是实现数据分析、竞品研究、自动化管理和精准营销的重要手段。本文将详细介绍1688商品详情接口的使用方法、技术细节以及…...
机试题——村落基站建设
题目描述 假设村落以二叉树的形状分布,我们需要选择在哪些村落建设基站。如果某个村落建设了基站,那么它和它相邻的村落(包括本节点、父节点和子节点)也会有信号覆盖。目标是计算出最少需要建设的基站数。 输入描述 输入为一个…...
2025年高压电工考试真题分享
以下是一些高压电工考试题: 单选题 1、高压架空线路的档距一般为( )。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案:B。解析:高压架空线路档距一般在 30 - 50m,这样的档距能较好地保证线…...