线程池配置实战:从CPU核数到性能优化的核心公式与避坑指南
1. 项目概述从“核”到“线”的底层逻辑最近在排查一个线上服务的性能瓶颈发现一个老生常谈但又常常被误解的问题线程池的线程数到底该设多少是拍脑袋定个100还是简单粗暴地设成CPU核数这个问题背后牵涉到对CPU核数、线程、进程这些基础概念的深刻理解。很多开发者包括一些有经验的可能知道“线程数不宜过多否则上下文切换开销大”也知道“可以设置为CPU核数”但为什么在什么场景下适用面对I/O密集型任务又该如何调整这些细节往往被忽略导致配置不当轻则资源浪费重则系统性能恶化。我自己在调优Java、Python后端服务甚至在配置一些中间件如Nginx、数据库连接池时都反复踩过这个坑。今天我就结合自己的实践把“线程数量与CPU核数”这个看似简单的话题掰开揉碎了讲希望能帮你建立起一个清晰的认知模型而不仅仅是记住一个公式。无论是处理Java线程池、Python的concurrent.futures还是理解操作系统调度这个底层逻辑都是相通的。2. 核心概念拆解CPU、核、进程与线程在讨论数量关系前我们必须先统一“语言”。这些概念经常被混淆但它们是整个讨论的基石。2.1 CPU核心真正的物理计算单元你可以把CPU的一个核心想象成一个真正的、独立的“厨房灶台”。单核CPU只有一个灶台一次只能专心炒一道菜执行一个线程的指令。多核CPU则有多个灶台如4核、8核、16核理论上可以同时炒4道、8道、16道菜。这里有几个关键点物理核心 vs. 逻辑核心现代CPU普遍支持超线程技术。这就像一个技艺高超的厨师可以在一个灶台上通过快速切换同时照看两口锅两个逻辑线程让灶台的利用率更高。但请注意这口“灶台”的物理资源火候、锅具是共享的所以两个逻辑核心的性能不等于两个物理核心。在考虑密集型计算时通常更应关注物理核心数。核心调度操作系统如Windows的任务管理器、Linux的top命令看到的CPU使用率负责决定哪个“炒菜任务”线程在哪个“灶台”核心上运行以及运行多久。这就是所谓的“CPU调度”。2.2 进程与线程任务的组织方式进程一个独立的“餐厅后厨”。它拥有自己独立的“食材仓库”内存空间、一套完整的“厨具”系统资源。不同后厨之间通常不能直接拿对方的食材需要通过特定的方式如进程间通信IPC来传递这保证了安全性和稳定性。启动一个程序如Chrome浏览器、一个Java Jar包通常就会创建一个或多个进程。线程一个“后厨”里的“厨师”。同一个后厨里的所有厨师共享这个后厨的食材仓库和大部分厨具。他们可以协作完成一道大菜一个任务沟通成本很低共享内存通信高效。但如果一个厨师把厨房弄得一团糟线程崩溃很可能影响同一个后厨里的其他厨师整个进程崩溃。为什么要有线程因为创建和管理一个全新的“后厨”进程开销很大。而在一个后厨内增加厨师线程来并发处理任务要轻量得多协作效率也高。这就是多线程编程的意义所在。2.3 上下文切换不可避免的开销这是理解线程数限制的关键。操作系统为了让多个“厨师”都能公平地用到“灶台”会采用“分时”策略让一个厨师在灶台上炒10毫秒然后换下一个厨师。这个“换人”的过程就是上下文切换。切换时操作系统需要保存当前厨师的“工作状态”用了哪些调料、火候调到几档、菜炒到几分熟即保存CPU寄存器和程序计数器的状态。把下一个厨师的“工作状态”从记录本里恢复出来摆好调料调好火候。然后才能开始让下一个厨师工作。这个过程本身需要消耗CPU时间和资源。如果厨师数量线程数远远多于灶台数量CPU核心数操作系统就会花费大量时间在“换人”上真正“炒菜”执行有用计算的时间比例反而下降。这就是线程数过多会导致性能下降甚至恶化的根本原因。在Linux下你可以使用vmstat或pidstat命令来监控上下文切换频率cs/involuntary_ctxt_switches这是一个非常重要的性能指标。注意上下文切换分为进程间切换和线程间切换。由于线程共享进程资源线程间切换需要保存和恢复的状态比进程间切换少得多因此开销也更小。但这不意味着线程切换可以忽略不计尤其是在高并发、线程数爆炸的场景下其累积效应非常可观。3. 线程数配置的核心公式与实践策略理解了底层概念我们来看最实际的问题线程池大小到底怎么设网上流传最广的公式是线程数 CPU核心数 * (1 平均等待时间 / 平均计算时间)这个公式常被称为“利特尔法则”或针对线程池的扩展提供了一个理论框架。我们来拆解一下CPU核心数这是你真正的并行能力上限。通常指物理核心数。你可以通过Runtime.getRuntime().availableProcessors()Java、os.cpu_count()Python、nprocLinux命令获取。平均计算时间线程真正占用CPU进行计算的时间。平均等待时间线程不占用CPU在等待的时间如等待网络响应、数据库I/O、磁盘读写、锁释放等。公式的含义是为了不让CPU闲着我们需要准备足够的线程使得当一个线程在等待时总有其他线程可以占用CPU进行计算。3.1 CPU密集型任务对于CPU密集型任务例如视频编码、复杂数学计算、图像处理任务的“等待时间”趋近于0。公式简化为线程数 ≈ CPU核心数如果设置超过核心数的线程额外的线程不仅无法获得真正的并行计算收益反而会引入不必要的上下文切换开销。因此对于纯CPU密集型应用线程数设置为CPU物理核心数或核心数11是为了在某个线程因页错误等短暂阻塞时CPU不至于完全空闲是一个很好的起点。实操示例Javaimport java.util.concurrent.*; public class CpuIntensiveTask { public static void main(String[] args) { // 获取逻辑处理器数量通常为物理核心数*2如果支持超线程 int corePoolSize Runtime.getRuntime().availableProcessors(); // 对于纯CPU密集型任务最大线程数也设为相同值 ThreadPoolExecutor executor new ThreadPoolExecutor( corePoolSize, // 核心线程数 corePoolSize, // 最大线程数 60L, TimeUnit.SECONDS, // 空闲线程保活时间 new LinkedBlockingQueue(1000) // 工作队列需设置合理容量 ); // ... 提交任务 } }3.2 I/O密集型或混合型任务对于I/O密集型任务例如Web服务器处理请求、数据库查询、文件操作任务的大部分时间都在等待I/O完成CPU计算时间很短。假设一个任务计算时间为1ms等待网络响应为99ms那么线程数 ≈ CPU核心数 * (1 99 / 1) CPU核心数 * 100这个数字可能非常大。但实践中我们不能无限制地创建线程因为每个线程本身会消耗内存主要是栈内存默认1MB左右大量线程会导致内存耗尽且线程间切换和管理开销也会剧增。因此对于I/O密集型服务通常的策略是设置一个远大于CPU核心数的线程池大小以充分利用CPU在I/O等待期间的闲置算力。这个数值需要通过压力测试来确定监控CPU使用率、系统负载、响应时间和吞吐量找到一个性能拐点。使用异步非阻塞模型如NIO、协程是更优解。这相当于请了一个“超级服务员”他不用一直等一个客人点完菜可以同时照看很多客人当某个客人的菜好了I/O就绪再去处理。这能极大地减少线程数量。这就是为什么Netty、Node.js、Go协程、Python asyncio在高并发I/O场景下表现优异的原因。混合型任务则需要根据其CPU计算和I/O等待的比例在上述两者之间权衡。3.3 常见框架的默认配置了解常见框架的默认行为可以避免一些低级错误Tomcat (Spring Boot默认)server.tomcat.threads.max默认是200。这是一个比较保守的、适用于一般I/O密集型Web应用的数值。Undertow (Spring Boot可选)默认基于工作线程Worker Thread和I/O线程分离性能模型不同通常比Tomcat用更少的线程处理更高的并发。Pythonconcurrent.futures.ThreadPoolExecutor默认最大线程数是os.cpu_count() * 5。这个启发式规则假设任务是I/O密集型的。数据库连接池 (如HikariCP)连接数配置同样遵循类似原理。连接数不是越大越好过多的连接会导致数据库服务器负载过高和上下文切换。通常建议设置与线程池大小相匹配或略小。4. 线程池配置的进阶考量与避坑指南仅仅知道公式是不够的。在实际工程中有更多细节需要考虑。4.1 队列Queue的选择与容量线程池的核心组件除了线程数还有工作队列。当所有核心线程都忙且队列未满时新任务会进入队列等待队列满了才会创建新线程直到达到最大线程数。队列类型无界队列如LinkedBlockingQueue无参构造任务可以无限堆积可能导致内存耗尽OOM。不推荐在生产环境使用。有界队列如ArrayBlockingQueue、LinkedBlockingQueue带容量可以防止资源耗尽。当队列满时根据拒绝策略处理新任务。同步移交队列如SynchronousQueue不存储元素每个插入操作必须等待另一个线程的移除操作。这相当于要求“立即有线程处理否则就拒绝或创建新线程”。适用于任务处理非常快的场景。队列容量与线程数的关系这是一个权衡。大队列可以缓冲突发流量但会导致任务平均等待时间变长响应时间变差。小队列对流量波动更敏感更容易触发拒绝或创建新线程。通常需要结合监控观察队列长度的变化趋势来调整。4.2 拒绝策略RejectedExecutionHandler当线程池和队列都满了新任务如何处理JDK提供了几种策略AbortPolicy默认直接抛出RejectedExecutionException。适用于需要快速失败、明确知道系统处理能力的场景。CallerRunsPolicy由调用者线程提交任务的线程自己执行该任务。这相当于让客户端分担一部分压力能有效减缓任务提交速度是一种简单的反馈机制。但要注意如果调用者是Web容器的线程可能会阻塞其处理新请求的能力。DiscardPolicy / DiscardOldestPolicy静默丢弃任务/丢弃队列中最老的任务。除非业务允许数据丢失否则慎用。选择拒绝策略需要根据业务容忍度来决定。对于关键业务可能需要记录日志、报警甚至将任务持久化到数据库或消息队列稍后重试。4.3 监控与动态调整线程池配置不是一劳永逸的。你需要监控以下指标线程池活跃度活跃线程数 vs. 核心/最大线程数。队列深度队列中等待的任务数。任务完成统计已完成的任务数、拒绝的任务数。任务执行时间平均、最大执行时间。在微服务架构下可以考虑使用动态线程池如Hippo、DynamicTp等开源组件它允许你在运行时根据指标动态调整核心参数以应对流量潮汐。4.4 常见陷阱与解决方案陷阱在Async或定时任务中使用默认线程池Spring的Async和定时任务默认使用一个无界队列的SimpleAsyncTaskExecutor或ThreadPoolTaskExecutor。在高负载下可能导致任务无限堆积最终OOM。解决方案永远为Async和定时任务显式配置一个有界队列的线程池。Configuration EnableAsync public class AsyncConfig implements AsyncConfigurer { Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(50); executor.setQueueCapacity(100); // 关键必须有界 executor.setThreadNamePrefix(MyAsync-); executor.initialize(); return executor; } }陷阱线程池的线程本地变量ThreadLocal泄漏如果线程池中的线程使用了ThreadLocal且任务执行完后没有清理由于线程会被复用之前任务的ThreadLocal值可能会泄露给后续任务造成数据错乱或内存泄漏因为ThreadLocal值会一直持有引用直到线程销毁。解决方案在任务执行结束时务必调用ThreadLocal.remove()进行清理。或者在提交任务时使用InheritableThreadLocal的变体并做好生命周期管理。陷阱错误的CPU核心数获取在容器化环境如Docker, Kubernetes中Runtime.getRuntime().availableProcessors()返回的是宿主机的CPU核心数而不是容器被限制的CPU配额。这会导致线程数设置过高。解决方案对于Java应用在JDK 10可以使用-XX:ActiveProcessorCount参数来指定或者使用第三方库如github.com/containers/cgroups来读取容器的实际CPU限制cgroup quota。更通用的做法是将线程池大小作为外部可配置参数通过环境变量注入。5. 超越线程协程与异步编程模型当并发量达到十万、百万级别时即使优化了线程池每个连接一个线程的模型阻塞I/O也会遇到瓶颈C10K问题。这时我们需要更轻量的并发单元。协程可以理解为用户态的轻量级线程。它的调度由程序自身控制而不是操作系统。切换协程的代价远低于线程切换因为不需要陷入内核态。一个线程内可以运行成千上万个协程。Go语言的goroutine、Python的asyncio、Kotlin的coroutine都是协程的典型实现。优势极高的并发能力极低的内存开销初始栈仅几KB。适用场景高并发I/O密集型服务如消息推送、实时通信、爬虫等。反应式/异步非阻塞基于事件循环Event Loop使用少量的线程通常与CPU核心数相当处理大量的网络连接。当某个连接的I/O事件就绪时事件循环会调用相应的回调函数。Netty、Node.js是此模型的代表。优势高吞吐资源利用率高。挑战编程模型复杂“回调地狱”需要通过Promise、Future、Reactive Streams等模式来管理异步流程。选择建议对于传统的业务CRUD应用使用优化后的线程池模型通常足够了。对于需要处理海量并发连接、对延迟和资源消耗极其敏感的新兴系统应优先考虑协程或异步非阻塞架构。6. 实战一个Web服务线程池配置案例假设我们有一个Spring Boot开发的商品查询API服务部署在一台8核16线程超线程的服务器上。该服务的主要逻辑是接收HTTP请求然后查询缓存Redis和数据库MySQL。任务分析这是一个典型的I/O密集型任务。大部分时间花在等待网络I/ORedis/MySQL响应上CPU计算序列化/反序列化JSON、简单的业务逻辑时间很短。初始配置估算我们关注物理核心数8核。假设一次请求中CPU计算时间占10%I/O等待时间占90%。根据公式线程数 ≈ 8 * (1 0.9/0.1) 8 * 10 80。考虑到超线程能带来一定增益以及系统还有其他进程JVM GC、监控Agent等我们可以将最大线程数设置在100-150之间作为一个起点。具体配置application.ymlserver: tomcat: threads: max: 150 # 最大工作线程数 min-spare: 20 # 最小空闲线程数用于快速响应初始请求 # 连接池配置需匹配 spring: datasource: hikari: maximum-pool-size: 50 # 数据库连接数不宜超过线程数建议为线程数的50%-80% redis: lettuce: pool: max-active: 100 # Redis连接池大小压力测试与调优使用JMeter或wrk进行压测。监控指标应用服务器的CPU使用率应保持在70-80%留有余地、GC情况、Tomcat线程池活跃线程数和队列深度、数据库CPU和连接数。观察队列深度如果队列深度长期为0说明线程数可能足够甚至过多如果队列深度持续增长说明线程处理不过来可能需要增加线程数或优化业务逻辑/I/O性能。观察响应时间随着并发数增加响应时间曲线出现拐点急剧上升时对应的并发数就是当前配置下的最佳吞吐量点。调整线程数寻找拐点最靠右即能承受更高并发的配置。7. 总结与个人心得线程数与CPU核数的关系本质上是在利用并行能力提升吞吐量和避免过多上下文切换开销之间寻找最佳平衡点的一个资源管理问题。没有放之四海而皆准的银弹参数。我个人的经验是理解业务类型是第一位的。先定性是CPU密集型还是I/O密集型这决定了调整的方向。公式和理论值只是起点。必须通过监控和压测来验证和调整。眼睛盯着仪表盘监控系统手里握着方向盘配置参数。关注队列和拒绝策略。它们和线程数同等重要共同决定了线程池在过载时的行为。在容器化环境中要小心。CPU配额、内存限制会改变游戏的规则。不要惧怕新技术模型。当线程池模型成为瓶颈时积极评估协程或异步非阻塞架构它们可能是解决下一阶段性能问题的钥匙。最后再分享一个排查线程数过多问题的小技巧在Linux上使用top -H -p pid查看某个进程下所有线程的CPU占用再结合jstack pidJava或pstack其他获取线程堆栈可以快速定位是哪些线程在大量消耗CPU或阻塞从而判断线程池行为是否正常。这比单纯看一个线程数字要有用得多。

相关新闻

生物信息学必备:用SeqKit高效处理FASTA文件,告别繁琐脚本

生物信息学必备:用SeqKit高效处理FASTA文件,告别繁琐脚本

1. 项目概述:为什么我们需要一个强大的FASTA文件处理工具在生物信息学的日常工作中,FASTA格式文件就像空气和水一样无处不在。无论是从NCBI的nr数据库下载的庞大序列集合,还是自己实验室测序得到的基因组草图,亦或是用于比对的参考…

2026/8/16 19:32:03 阅读更多 →
Whisky 保姆级上手攻略:免费让 Mac 流畅运行 Windows 软件,从安装到调优一篇搞定

Whisky 保姆级上手攻略:免费让 Mac 流畅运行 Windows 软件,从安装到调优一篇搞定

Whisky 保姆级上手攻略:免费让 Mac 流畅运行 Windows 软件,从安装到调优一篇搞定 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 朋友小林的 MacBook 上&…

2026/8/16 19:32:03 阅读更多 →
如何彻底移除 OneDrive?这款批处理卸载工具让 Windows 10 从此清净

如何彻底移除 OneDrive?这款批处理卸载工具让 Windows 10 从此清净

如何彻底移除 OneDrive?这款批处理卸载工具让 Windows 10 从此清净 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 正在为电…

2026/8/16 19:31:03 阅读更多 →

最新新闻

Windows 10 运行安卓应用终极指南:免费移植方案 WSA-Windows-10 快速上手

Windows 10 运行安卓应用终极指南:免费移植方案 WSA-Windows-10 快速上手

Windows 10 运行安卓应用终极指南:免费移植方案 WSA-Windows-10 快速上手 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 前阵子朋友向…

2026/8/16 20:13:17 阅读更多 →
滚动时域优化:从核心原理到工程实现的动态最优控制框架

滚动时域优化:从核心原理到工程实现的动态最优控制框架

1. 从“一次性”到“滚动式”:为什么我们需要滚动时域优化? 在工业控制、机器人路径规划、自动驾驶,甚至是金融交易策略里,我们常常面临一个经典难题:如何在一个动态变化、充满不确定性的环境中,做出最优的…

2026/8/16 20:13:17 阅读更多 →
哔哩哔哩UWP客户端完整上手指南:3 步搭建 Windows 追番追更方案

哔哩哔哩UWP客户端完整上手指南:3 步搭建 Windows 追番追更方案

哔哩哔哩UWP客户端完整上手指南:3 步搭建 Windows 追番追更方案 【免费下载链接】biliuwp bilibili uwp 项目地址: https://gitcode.com/gh_mirrors/bi/biliuwp Windows 上想痛痛快快刷 B 站,网页版总觉得差点意思?这个开源项目——哔…

2026/8/16 20:13:17 阅读更多 →
零基础如何用 UndertaleModTool 解包魔改 GameMaker 游戏?5步通关的终极上手指南

零基础如何用 UndertaleModTool 解包魔改 GameMaker 游戏?5步通关的终极上手指南

零基础如何用 UndertaleModTool 解包魔改 GameMaker 游戏?5步通关的终极上手指南 【免费下载链接】UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other GameMaker games!) 项目地址: https://gitcode.com/gh_…

2026/8/16 20:13:17 阅读更多 →
如何把任意网页元素一键导出为高清图片?零依赖 DOM 截图引擎实战

如何把任意网页元素一键导出为高清图片?零依赖 DOM 截图引擎实战

如何把任意网页元素一键导出为高清图片?零依赖 DOM 截图引擎实战 【免费下载链接】snapdom High-performance engine for capturing, modifying, and converting DOM elements into any format. 项目地址: https://gitcode.com/GitHub_Trending/sn/snapdom 凌…

2026/8/16 20:13:17 阅读更多 →
Windows 11显示缩放自动重置的根源分析与系统性修复指南

Windows 11显示缩放自动重置的根源分析与系统性修复指南

1. 问题现象与核心影响:一个看似微小却极度恼人的“Bug”如果你和我一样,在Windows 11上为了获得更舒适的视觉体验,将显示缩放比例设置为了125%、150%甚至更高,然后某天开机或重启后,发现所有窗口、图标、字体都突然“…

2026/8/16 20:12:17 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →