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

异步处理优化:多线程线程池与消息队列的选择与应用

目录

一、异步处理方式引入

(一)异步业务识别

(二)明确异步处理方式

二、多线程线程池(Thread Pool)

(一)工作原理

(二)直面优缺点和适用场景

1.需要快速响应的异步任务

2.本地异步处理,任务不需要跨服务

3.有较好控制并发数的场景,避免过度占用资源

4.整合其优缺点

(三)业务代码实现

三、消息队列(MQ)

(一)工作原理

(二)直面优缺点和适用场景

1.分布式系统,多个服务之间需要解耦异步任务

2.高并发、高可靠性要求的任务处理

3.需要保证任务持久性、顺序性或可靠性的场景

4.整合其优缺点

(三)业务代码实现

四、异步方式选择

(一)任务是否需要跨服务或分布式处理

(二)任务的处理可靠性和持久性需求

(三)系统的并发处理能力和资源需求

(四) 延迟要求

(五)总结

五、总结


干货分享,感谢您的阅读!

在现代软件开发中,性能优化是每个开发者和团队不可回避的话题。随着系统复杂度的增加,尤其是面对高并发请求时,单纯依赖同步操作已经无法满足性能要求,导致接口响应缓慢、资源浪费等问题。为了提高系统的响应速度和可扩展性,异步处理成为一种有效的解决方案。异步处理将一些非核心逻辑的任务从主线程中剥离出来,通过并发执行,减少了主流程的等待时间,从而提升了用户体验和系统吞吐量。

本文将详细探讨常见的两种异步处理方式:多线程线程池消息队列(MQ)。通过分析它们的工作原理、优缺点以及适用场景,帮助读者更好地理解如何在实际开发中选择合适的异步处理方式。无论是本地并发处理,还是跨服务的任务解耦,合理选择异步策略将大大提升系统的性能和稳定性。

一、异步处理方式引入

在接口性能优化过程中,重新梳理业务逻辑,并识别哪些部分是核心逻辑,哪些部分是非核心逻辑,是非常重要的。如果把所有操作都放在接口中同步执行,可能会导致接口性能瓶颈,影响用户体验。因此,合理地将非核心逻辑异步化,可以显著提高系统的性能和响应速度。

(一)异步业务识别

假设在一个用户请求接口中,业务逻辑涉及到多个操作:业务操作、发站内通知、记录操作日志等。通常情况下,很多开发者可能会选择将这些操作放在一个同步执行的流程中,这样虽然简化了开发,但也不可避免地增加了接口响应时间,影响了整体性能。

具体来说:

  1. 核心逻辑:是指直接影响用户请求处理结果的部分,例如在这个例子中,业务操作是核心逻辑。
  2. 非核心逻辑:是指那些不影响用户请求直接响应的部分,例如发站内通知和记录操作日志,这些操作可以稍微延迟执行,对用户体验的影响较小。

在接口执行时,核心逻辑必须同步完成,但非核心逻辑则可以通过异步处理进行优化,从而不影响接口的响应时间。

(二)明确异步处理方式

所以为了优化性能,可以遵循以下原则:

  • 核心逻辑同步执行:对于需要立即返回用户请求的操作,必须同步执行并写入数据库,以确保数据一致性。
  • 非核心逻辑异步执行:对于不直接影响业务逻辑的操作,可以异步执行。这类操作可能包括:
    • 发送站内通知
    • 记录操作日志
    • 发送消息到消息队列(如 MQ)

异步化这些非核心操作,可以有效释放主线程,提高接口响应速度,同时保证后台任务的完成。常见的异步处理方式主要有两种:多线程线程池消息队列(MQ)

二、多线程线程池(Thread Pool)

(一)工作原理

多线程线程池的核心思想是将任务分配到多个线程中并发执行,从而减少任务等待时间。线程池预先创建一定数量的线程,通过管理这些线程来执行异步任务。线程池的管理由框架(如 Java 中的 ExecutorService)来处理,它负责线程的复用和销毁。

这部分的重点知识和使用可见:

  • Java线程池ThreadPoolExecutor背后的秘密与实践
  • 多线程编程全攻略:提升性能与线程安全的必备知识
  • 通用线程池封装与异步化实践:提升小红书发现页的响应速度

(二)直面优缺点和适用场景

多线程线程池是一种常见的并发执行异步任务的方式,通常用于以下场景:

1.需要快速响应的异步任务

多线程线程池适合用于响应时间要求较短的场景。由于线程池是预先创建好一定数量的线程,因此任务可以直接交给空闲的线程处理,避免了线程的频繁创建和销毁开销。这使得多线程线程池能够迅速响应并发任务,特别是对响应时间要求较高的业务,比如实时数据处理、事件驱动等。

2.本地异步处理,任务不需要跨服务

线程池主要适用于本地应用内的异步任务处理。例如,应用中某些计算密集型任务或需要并发处理的I/O操作,可以使用线程池在本地多核环境中实现并发。任务执行的速度比较快,且没有跨服务通信的需求,因此消息队列的引入会增加不必要的复杂度和延迟。

3.有较好控制并发数的场景,避免过度占用资源

线程池提供了对并发线程数的控制,可以避免过度创建线程导致资源耗尽。通过设置最大线程数,可以有效控制系统负载,避免线程过多导致的上下文切换开销过大,甚至系统崩溃。

在这类场景中,你可以根据负载情况调整线程池的大小。比如,使用 Java 中的 ExecutorService,可以通过设置核心线程数、最大线程数、线程存活时间等参数来精细化控制并发量和线程的生命周期。

4.整合其优缺点

优点

  • 响应时间短,适用于本地快速异步任务。
  • 可控的线程数量,避免过度占用系统资源。
  • 实现简单,适合单机应用。

缺点

  • 难以处理分布式任务和跨服务的异步通信。
  • 高并发情况下,线程池仍然可能遇到资源瓶颈或线程争用问题。

(三)业务代码实现

按照此思路,其实现方式如下图:

具体代码展示如:

// 创建一个固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(10); public void handleRequest(UserRequest request) {// 核心业务逻辑businessOperation(request);// 异步执行非核心逻辑executorService.submit(() -> sendNotification(request));  // 异步发送通知executorService.submit(() -> logUserAction(request));     // 异步记录操作日志
}

三、消息队列(MQ)

(一)工作原理

消息队列通过将任务封装为消息并发送到消息队列中,由后台消费者异步消费这些消息来完成任务。消息队列在异步处理任务时,将任务放入队列,任务的处理可以异步进行,队列通常会确保消息的顺序和可靠性。

背景知识可见:消息中间件知识整理(RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ)

(二)直面优缺点和适用场景

消息队列(MQ)是一种用于异步任务处理的机制,常用于分布式系统中,具有以下应用场景:

1.分布式系统,多个服务之间需要解耦异步任务

消息队列是跨服务通信的理想选择。在分布式系统中,多个服务之间往往需要解耦,以减少直接依赖。如果任务的处理时间不确定,或者任务量过大,直接将任务交给另一服务处理可能会造成系统的负载过高或响应延迟。通过消息队列,任务会被异步放入队列中,由其他服务按需消费。

2.高并发、高可靠性要求的任务处理

在高并发场景下,消息队列能够很好地处理任务的高并发要求。生产者和消费者之间的解耦能够避免高并发情况下的性能瓶颈。此外,消息队列通常有持久化机制,可以保证消息在传输过程中的可靠性。如果一个服务失败或出现网络问题,消息仍然会被持久化,等到系统恢复后可以继续消费,确保任务不丢失。

3.需要保证任务持久性、顺序性或可靠性的场景

消息队列提供了消息的持久化、顺序消费等功能,这对于需要保证任务处理可靠性和顺序性的场景非常有用。例如,如果任务的处理顺序至关重要(如订单支付流程),消息队列可以确保消息按顺序被消费。常见的消息队列如 RabbitMQ、Kafka 都支持消息的持久化,能够确保即使系统崩溃或重启,也不会丢失消息。

4.整合其优缺点

优点:

  • 解耦多个系统或服务,适用于分布式环境。
  • 高并发下仍能保持良好的性能,避免资源竞争。
  • 提供可靠的任务持久性和顺序性保证。
  • 消息队列能够支持复杂的流量控制、重试机制和任务排队。

缺点:

  • 需要额外的基础设施支持(如部署消息队列服务)。
  • 延迟较高,响应时间可能较长。
  • 需要额外的操作和维护工作,配置复杂。

(三)业务代码实现

按照此思路,其实现方式如下图:

具体代码展示如:

public class UserService {// 假设是 MQ 的服务类private MessageQueueService messageQueueService; public void handleRequest(UserRequest request) {// 核心业务逻辑businessOperation(request);// 将异步任务放入消息队列messageQueueService.sendMessage("sendNotification", request);messageQueueService.sendMessage("logUserAction", request);}
}

四、异步方式选择

选择多线程线程池还是消息队列取决于你的业务需求和系统架构。选择考虑点:

(一)任务是否需要跨服务或分布式处理

  • 如果任务需要跨多个服务进行异步处理,推荐使用消息队列。它能够解耦服务,适应分布式系统的需求。
  • 如果所有任务都在同一台机器或同一应用中,且不涉及复杂的跨服务通信,可以使用线程池。

(二)任务的处理可靠性和持久性需求

  • 如果任务的可靠性要求高,必须确保任务不丢失或顺序性,消息队列是更好的选择。消息队列通常具有持久化和确认机制,能够保证任务的可靠传输。
  • 如果任务可以容忍失败或丢失,且不需要保证顺序性,线程池足以满足需求。

(三)系统的并发处理能力和资源需求

  • 如果需要较高并发且能够控制线程数量和资源消耗,线程池是一个合适的选择。线程池有更好的资源控制,适用于局部的并发处理。
  • 如果任务的处理量特别大,且并发量需要横向扩展,消息队列可以帮助系统水平扩展。

(四) 延迟要求

  • 如果任务需要即时处理(低延迟),线程池通常能提供更低的响应时间,因为它直接在线程池中执行任务。
  • 如果延迟要求较高,使用消息队列时可能会经历消息的排队和消费过程,延迟可能较大。

(五)总结

  • 线程池:适用于本地并发处理,快速响应且资源可控的场景。适合处理计算密集型任务、I/O 密集型任务或需要较高并发的场景。
  • 消息队列:适用于分布式系统,多个服务之间解耦、高并发、高可靠性的任务处理场景。适合任务的持久化、顺序性或需要跨服务异步处理的场景。

选择异步处理方式时,要综合考虑系统架构、任务的处理时间、并发量、可靠性要求等因素。如果是本地短时间内的异步任务,线程池足够;如果是分布式且需要高可靠性的任务,消息队列则更加合适。

五、总结

在处理异步任务时,选择合适的方式是优化系统性能的关键。多线程线程池适合用于本地任务的并发处理,尤其是当响应时间要求较低、资源可控、任务量不大的时候。它能够提高主线程的响应速度,但对于跨服务的任务或高并发场景,其局限性显现。另一方面,消息队列则更适合分布式系统,尤其是当任务需要跨多个服务、对可靠性和任务顺序性有较高要求时。它通过解耦服务、提供持久化存储、处理高并发任务,能够有效提升系统的可扩展性和可靠性。

因此,选择异步处理方式时需要根据实际需求进行权衡。如果任务是本地的、低延迟的且负载较轻,线程池是一个不错的选择;而如果任务需要分布式处理,或者对任务的可靠性、持久性要求较高,消息队列则更为合适。理解这两种异步方式的特点与适用场景,将帮助开发者在设计系统时做出更为明智的决策,从而实现性能的最优化。

相关文章:

异步处理优化:多线程线程池与消息队列的选择与应用

目录 一、异步处理方式引入 (一)异步业务识别 (二)明确异步处理方式 二、多线程线程池(Thread Pool) (一)工作原理 (二)直面优缺点和适用场景 1.需要快…...

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…...

计算机毕业设计SpringCloud+大模型微服务高考志愿填报推荐系统 高考大数据 SparkML机器学习 深度学习 人工智能 Python爬虫 知识图谱

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

AIGC训练效率与模型优化的深入探讨

文章目录 1.AIGC概述2.AIGC模型训练效率的重要性3.模型优化的概念与目标4.模型优化策略4.1 学习率调节4.2 模型架构选择4.3 数据预处理与增强4.4 正则化技术4.5 量化与剪枝 5.代码示例6.结论 人工智能领域的发展,人工智能生成内容( AIGC)越来…...

《深入浅出HTTPS》读书笔记(13):块密码算法之迭代模式(续)

CTR模式 每次迭代运算的时候要生成一个密钥流(keystream)。 各个密钥流之间是有关系的,最简单的方式就是密钥流不断递增,所以才叫作计数器模式。 ◎在处理迭代之前,先生成每个密钥流,有n个数据块&#xff0…...

定时任务删除MongoDB历史数据

前言 MongoDB数据过多,导致存储成本飙升,为了降低成本,需要将历史数据删除。 删除逻辑 添加配置文件控制删除逻辑 syncconfig:deleteMongoConfig:#同步状态,true同步,false不同步syncStatus: true#删除数据的时间&…...

Simulink的SIL软件在环测试

以基于模型的设计(MBD)的软件开发时,需要进行SIL(软件在环测试)。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中,用在需要将控制器生成移植到硬件前,把控制器的模块生成代码&…...

你能穿过迷雾看清一切吗

很多事情的真相有谁知道? 我和家里人被看不见的攻击攻击和操控,失控和无助状态被假鬼录制,然后安排某些不知道整个实际情况和真相的人去听,间接歪曲了整件事情。 各种高科技配合和各种脑功能操控伤害是一般人想都想不到的&#…...

8 设计模式之简单工厂模式

设计模式是软件开发中的一套通用解决方案,而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中,我将为大家详细介绍简单工厂模式的概念、优缺点,以及通过一个饮料制作的案例,帮助大家更好地理解和应用这种模式。 一、…...

一步一步写线程之十六线程的安全退出之一理论分析

一、多线程的开发 多线程的开发,在实际场景中几乎是无法避开的。即使是前端看似没有使用线程,其实在底层的框架中也使用了线程进行了支撑。至少到现在,不管是协程还是其它什么新的编程方式,仍然无法撼动线程的主流地位。 多线程的…...

《Learn Three.js》学习(4) 材质

前言: 材质为scene中物体的皮肤,有着不同的特性和视觉效果。 材质的共有属性: 基础属性: 融合属性: 融合决定了我们渲染的颜色如何与它们后面的颜色交互 高级属性: 与WebGL内部有关 简单材质&#xff1…...

【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析

【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析 一、QNX 侧触摸屏配置基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【…...

Oracle SCN与时间戳的映射关系

目录 一、基本概述 二、相关操作 三、参考文档 一、基本概述 Oracle 数据库中的 SYS.SMON_SCN_TIME 表是一个关键的内部表,主要用于记录过去时间段中SCN与具体的时间戳之间的映射关系。这种映射关系可以帮助用户将 SCN 值转换为可读性更强的时间戳,从而…...

量化交易系统开发-实时行情自动化交易-8.2.发明者FMZ平台

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于发明者FMZ平台介绍。 发明…...

HBU深度学习作业9

1. 实现SRN (1)使用Numpy实现SRN import numpy as npinputs np.array([[1., 1.],[1., 1.],[2., 2.]]) # 初始化输入序列 print(inputs is , inputs)state_t np.zeros(2, ) # 初始化存储器 print(state_t is , state_t)w1, w2, w3, w4, w5, w6, w7, …...

关于otter监控告警使用

一、背景 近期在使用otter完成单机房单向同步时,常常遇到channel假死的情况,导致Pipeline同步停止,系统表数据同步停止,影响生产环境用户数据查询相关的功能,虽然事后能够通过停channel后再启用channel重新启用…...

复合查询和内外连接

文章目录 1. 简单查询2. 多表查询2.1 显示雇员名、雇员工资以及所在部门的名字2.2 显示部门号为10的部门名,员工名和工资2.3 显示各个员工的姓名,工资,及工资级别 3. 自连接4. 子查询4.1 where后的子查询4.1.1 单行子查询4.1.2 多行子查询 (i…...

动态规划【C++优质版】

(本文未经作者书面允许,禁止以任何形式传播(包括但不限于转载,翻译……)如需引用 请标注原作者) Intro: 动态规划是一种用于解决优化问题的算法策略。在 C 中,它主要用于处理那些具…...

柔性芯片:实现万物互联的催化剂

物联网 (IoT) 市场已经非常成熟,麦肯锡预测,物联网将再创高峰,到 2030 年将达到 12.5 万亿美元的估值。然而,万物互联 (IoE) 的愿景尚未实现,即由数十亿台智能互联设备组成,提供大规模洞察和效率。 究竟是…...

【分布式】分布式事务

目录 1、事务的发展 2、本地事务 (1)如何保障原子性和持久性? (2)如何保障隔离性? 2、全局事务 (1)XA事务的两段式提交 (2)XA事务的三段式提交…...

nacos安装部署

nacos安装部署 1.安装nacos 1.安装nacos nacos的安装很简单下载后解压启动即可,但是在启动前请确保jdk环境正常; 1.首先我们要下载nacos安装包:可以到官网下载,注意我这里使用的是2.1.0版本; 2.下载完成后&#xff0…...

git 上传代码时报错

在上传代码时,显示无法上传 PS E:\JavaWeb\vue3-project> git push To https://gitee.com/evening-breeze-2003/vue3.git! [rejected] master -> master (non-fast-forward) error: failed to push some refs to https://gitee.com/evening-breeze-20…...

【C++】数字位数提取:从个位到十位的深入分析与理论拓展

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯第一题:提取个位数解法代码解法分析代码优化拓展思考:取模运算的普适性 💯第二题:提取十位数题目解读与思路分析方法一&…...

数据结构--二叉树的创建和遍历

目录 引入 定义 性质 二叉树的创建 迭代法 注意事项: 递归法 注意事项: 二叉树的遍历 深度优先 广度优先 先序遍历(前序遍历) 中序遍历 后序遍历 层序遍历 查找树结构中是否存在某数值 方法一: 方法…...

CEF127 编译指南 Linux篇 - 安装Git和Python(三)

1. 引言 在前面的文章中,我们已经完成了基础开发工具的安装和配置。接下来,我们需要安装两个同样重要的工具:Git 和 Python。这两个工具在 CEF 的编译过程中扮演着关键角色。Git 负责管理和获取源代码,而 Python 则用于运行各种编…...

计算机网络的类型

目录 按覆盖范围分类 个人区域网(PAN) 局域网(LAN) 城域网(MAN) 4. 广域网(WAN) 按使用场景和性质分类 公网(全球网络) 外网 内网(私有网…...

Web入门(学习笔记)

Web入门 文章目录 Web入门SpringSpringBootWeb入门HTTP协议HTTP-概述HTTP特点 HTTP-请求协议HTTP-请求数据格式 HTTP-响应协议响应状态码 HTTP-协议解析 Web服务器-TomcatWeb服务器简介基本使用Tomcat文件夹目录解析常见问题Tomcat部署项目 入门程序解析**内嵌的Tomcat服务器**…...

mind+自定义库编写注意事项

在mind图形化命令编写中,main.ts 文件是通过图形化编程工具生成 C 代码,然后将生成的 C 代码上传到 Arduino Uno 上执行。 这些由main.ts定义的图形化代码通过生成的代码,需要包含调用arduinoc/libraries文件夹的*.h和*.cpp文件&#…...

jQuery零基础入门速通(上)

大家好,我是小黄。 在前端开发的世界里,jQuery以其简洁的语法和强大的功能,一直是许多开发者手中的利器。它不仅简化了HTML文档遍历和操作、事件处理、动画以及Ajax交互,还极大地提高了开发效率。本文将带你走进jQuery的世界&…...

计算机网络-Wireshark探索IPv4

使用工具 Wiresharkcurl(MacOS)traceroute: This lab uses “traceroute” to find the router level path from your computer to a remote Internet host. traceroute is a standard command-line utility for discovering the Internet paths that your computer uses. It i…...

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…...

《构建 C++分布式计算框架:赋能人工智能模型并行训练》

在人工智能迅猛发展的今天,模型训练所需的计算资源呈指数级增长。为了高效地支持人工智能模型在多节点、多 GPU/CPU 集群上的并行训练,基于 C构建分布式计算框架成为了关键之举。 一、分布式计算框架的核心意义 随着人工智能模型复杂度的不断攀升&…...

分支定价算法Branch and price

分支定价算法是进阶版的列生成算法,是用来专门求解整数规划问题的。 目录 1.整数规划与线性规划的关系 2.限制主问题(RLMP)求得整数解 3.B&P用法:以VRPTW为例 列生成是求解线性规划问题的算法,通过不断往限制主…...

【信息系统项目管理师】第5章:信息系统工程 考点梳理

文章目录 5.1 软件工程5.1.1 架构设计1、软件架构风格2、软件架构评估 5.1.2 需求分析1、需求的层次2、需求过程(重点)3、UML事务、关系和视图4、面向对象分析 5.1.3 软件设计1、结构化设计2、面向对象设计3、设计模式 5.1.4 软件实现1、软件配置管理2、…...

kdump调试分析(适用于麒麟,ubuntu等OS)

1. kdump基本原理 1.1 内核崩溃处理机制 当 Linux 系统内核发生崩溃时,通常会触发 panic,系统停止正常运行。Kdump 在这种情况下: 使用一个备用的内核(称为 crash kernel)来启动最小化的环境。从崩溃的主内核中复制内存内容(转储文件)。将转储文件保存到预定义的存储位…...

Ubuntu在NVME硬盘使用Systemback安装记录

问题 使用Systemback重装系统找不到NVME硬盘。 0.使用Systemback制作iso后,制作启动盘 1.插入启动盘进入live mode模式 2.安装gparted sudo apt-get update sudo apt-get install gparted3.使用gparted对待分区硬盘进行分区 gparted按照你希望的分区方式分区即…...

C++多态的实现原理

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、类的继承 子类对象在创建时会首先调用父类的构造函数 父类构造函数执行结束后,执行子类的构造函数 当父类的构造函数有参数时,需要在子类的初始化列表中显式调用 Child(int i) : …...

com.github.gavlyukovskiy依赖是做什么的呢?

p6spy-spring-boot-starter 是一个Spring Boot的starter,用于集成P6Spy库。P6Spy是一个开源的数据库连接池代理工具,它可以拦截和记录所有的SQL语句及其执行时间,从而帮助开发者进行SQL性能分析和调试。 功能概述 SQL日志记录: P…...

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …...

离线安装 Docker-IO:详细步骤指南

离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…...

梯度爆炸与消失

梯度爆炸和梯度消失 一、概念解析 (一)梯度爆炸 定义 在深度神经网络训练的反向传播过程中,梯度爆炸是指梯度的值过大的现象。这会使模型的参数更新出现异常。 产生原因 深层网络与链式法则:深度神经网络按链式法则计算某层权重…...

动捕 动作捕捉学习笔记

2024.11.28 实时动作捕捉 ThreeDPoseTracker VRMLiveViewer 实现虚拟主播跳舞自由_哔哩哔哩_bilibili blender 手工操作,不能渲染到原视频 【快速有效】三分钟学会,通过blender把网上视频武术动作捕捉绑定到3D角色上,需要使用Auto-rig Pro(ARP&#xf…...

spark3.x之后时间格式数据偶发报错org.apache.spark.SparkUpgradeException

3.x之后如果你去处理2.x生成的时间字符串数据,很容易遇到一个问题 Error operating ExecuteStatement: org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: Fail to parse 20200725__cb90fcc3_8006_46…...

计算机网络(二)

ip地址:11010010:01011110:00100100:00010100 子网掩码:11111111:11111111:11111111:11000000 and :11010010:01011110:00100100:00000000 210.94.36.0的下一站为R1 因为255为11111111 192为&#xff…...

如何在Spark中使用gbdt模型分布式预测

这目录 1 训练gbdt模型2 第三方包python环境打包3 Spark中使用gbdt模型3.1 spark配置文件3.2 主函数main.py 4 spark任务提交 1 训练gbdt模型 我们可以基于lightgbm快速的训练一个gbdt模型,训练相对比较简单,只要把训练样本处理好,几行代码可…...

llamaindex实战-ChatEngine-ReAct Agent模式

概述 ReAct 是一种基于Agent的聊天模式,构建在数据查询引擎之上。对于每次聊天交互,代理都会进入一个 ReAct 循环: 首先决定是否使用查询引擎工具并提出适当的输入 (可选)使用查询引擎工具并观察其输出 决定是否重复…...

关于音频 DSP 的接口种类以及其应用场景介绍

在音频系统中,DSP(数字信号处理器)扮演着重要角色,通常会通过不同的接口与音频系统中的其他组件(如功放、扬声器、音频源等)进行连接。以汽车应用场景为例,以下是一些常见的接口类型分类及其介绍…...

DLL中的inline static成员变量:Windows开发中的常见陷阱

在Windows平台进行C开发时,DLL(动态链接库)是一个非常重要的概念。它让我们能够实现代码的模块化和动态加载,提高了程序的灵活性和维护性。然而,当我们在DLL中使用C17引入的inline static成员变量时,可能会…...

7. 现代卷积神经网络

文章目录 7.1. 深度卷积神经网络(AlexNet)7.2. 使用块的网络(VGG)7.3. 网络中的网络(NiN)7.4. 含并行连结的网络(GoogLeNet)7.5. 批量规范化7.5.1. 训练深层网络7.5.2. 批量规范化层…...

软件测试丨Pytest生命周期与数据驱动

Pytest的生命周期概述 Pytest 是一个强大的测试框架,提供了丰富的特性来简化测试执行。它的生命周期包括多个阶段,涉及从准备测试、执行测试到报告结果的完整流程。因此,理解Pytest的生命周期将帮助我们更好地设计和管理测试用例。 开始阶段…...