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

CompletableFuture并行处理任务

CompletableFuture并行处理任务

  • CompletableFuture
    • 基本概念与特性
    • 创建CompletableFuture实例
  • 任务编排方法
  • 线程池选择
    • 默认线程池
    • 自定义线程池
    • 线程池配置建议
  • 代码示例
  • 同步代码

CompletableFuture

基本概念与特性

异步执行: CompletableFuture允许任务在后台线程中异步执行,不会阻塞主线程,从而提高了应用程序的响应性和性能。
可组合性: CompletableFuture的操作可以组合成一个或多个CompletableFuture对象,构成复杂的异步计算链。这包括结果的转换、组合以及异常处理等。
异常处理: 通过exceptionally()等方法,CompletableFuture可以捕获计算中的异常并返回默认值,或者通过handle()等方法同时处理正常结果和异常。
取消与超时: 支持取消异步任务和设置超时时间,避免任务的无限等待。
非阻塞式等待: 提供了非阻塞式的等待方法,如join()和getNow(),可以在不阻塞当前线程的情况下获取任务的结果。
并行处理: 在处理多个耗时操作时,如I/O操作、数据库访问或网络请求,CompletableFuture可以并行执行这些任务,提高系统吞吐量和响应能力。

创建CompletableFuture实例

supplyAsync():用于创建返回结果的异步任务。例如:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行异步任务并返回结果return "Hello, CompletableFuture!";
});

runAsync():用于创建不返回结果的异步任务。例如:

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 执行异步任务System.out.println("Task running asynchronously");
});

任务编排方法

转换类方法:

  • thenApply() / thenApplyAsync():将上一个任务的结果转换为新的结果。thenApply()在同一个线程中执行,而 thenApplyAsync()可能在新的线程中执行。
  • thenAccept() / thenAcceptAsync():处理上一个任务的结果,但不返回新的值。thenAccept()在同一个线程中执行,而thenAcceptAsync()可能在新的线程中执行。
  • thenRun() / thenRunAsync():在上一个任务完成后执行一个操作,不使用上一个任务的结果。

组合类方法:

  • thenCompose() / thenComposeAsync():将两个CompletableFuture组合成一个。当一个任务依赖另一个任务的结果时,可以使用此方法。
  • thenCombine() / thenCombineAsync():组合两个独立任务的结果。需要两个独立任务的结果进行计算时,可以使用此方法。

多任务协调方法:

  • thenCompose() / thenComposeAsync():将两个CompletableFuture组合成一个。当一个任务依赖另一个任务的结果时,可以使用此方法。
  • thenCombine() / thenCombineAsync():组合两个独立任务的结果。需要两个独立任务的结果进行计算时,可以使用此方法。

异常处理机制:

  • exceptionally():处理异常并提供默认值。当CompletableFuture中的任务抛出异常时,可以捕获该异常并返回一个默认值。
  • handle() / handleAsync():处理正常结果和异常。无论任务是否成功完成,都可以使用此方法处理结果或异常。
  • whenComplete() / whenCompleteAsync():任务完成时的回调(正常或异常)。可以在任务完成后执行一些清理工作或记录日志等。

线程池选择

默认线程池

如果未显式指定线程池,CompletableFuture 默认使用 ForkJoinPool.commonPool()。
适用场景:

  • 计算密集型任务(如复杂数学计算、数据处理)。
  • 短期任务且任务量较小。

特点:

  • 线程池大小为 Runtime.getRunTime().availableProcessors()-1(如 4 核 CPU 默认 3 线程)。
  • 所有 CompletableFuture 共享同一个公共池,可能导致资源竞争。

自定义线程池

通过显式传递 Executor,可以更精细地控制线程池行为。
适用场景:

  • I/O 密集型任务(如网络请求、数据库查询)。
  • 需要隔离任务类型(避免公共池资源耗尽)。
  • 长期运行或阻塞任务。
// 创建自定义线程池
ExecutorService customExecutor = new ThreadPoolExecutor(10,                        // 核心线程数50,                        // 最大线程数60L,                       // 空闲线程存活时间TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000), // 有界队列(容量 1000)new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);// 使用自定义线程池
CompletableFuture.supplyAsync(() -> {return queryDataBase();
}, customExecutor);

线程池配置建议

参数计算密集型任务IO密集型任务
核心线程数N+12N+1
最大线程数等于核心线程数较高(如 100~200)
队列类型同步队列(SynchronousQueue)有界队列(如 LinkedBlockingQueue)
拒绝策略抛异常(AbortPolicy)级或重试(如 CallerRunsPolicy)

队列与拒绝策略

  • 有界队列:防止任务无限堆积导致内存溢出(OOM)。
  • 拒绝策略:
    • CallerRunsPolicy:主线程执行被拒绝的任务(避免任务丢失)。
    • DiscardOldestPolicy:丢弃队列中最旧的任务(适合实时性要求高的场景)。

代码示例

import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;public class ApplicationTest {public static void main(String[] args) {long start = System.currentTimeMillis();System.out.println("================ begin ===================");// 1. 创建异步任务列表List<CompletableFuture<List<String>>> futures = new ArrayList<>();// 2. 添加异步任务(并行查询不同数据库)futures.add(CompletableFuture.supplyAsync(() -> queryDatabase("DB1")));futures.add(CompletableFuture.supplyAsync(() -> queryDatabase("DB2")));futures.add(CompletableFuture.supplyAsync(() -> queryDatabase("DB3")));// 3. 等待所有任务完成,并合并结果CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();// 4. 处理最终结果List<String> resultList = new ArrayList<>();for (CompletableFuture<List<String>> future : futures) {try {List<String> oneResult = future.get();resultList.addAll(oneResult);} catch (Exception e) {System.out.println("批量查询异常 : " + e);}}//5. 阻塞获取最终结果(实际中应避免在主线程阻塞)System.out.println(System.currentTimeMillis() - start);System.out.println("合并后的结果数量: " + resultList.size());System.out.println(resultList);System.out.println("================ end ===================");// 或者// 等待所有任务完成,并合并结果CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));// 最终处理结果List<String> mergedResults = allFutures.thenApply(v ->futures.stream().flatMap(future -> future.join().stream()).collect(Collectors.toList())).join();System.out.println(mergedResults);}// 模拟数据库查询方法private static List<String> queryDatabase(String source) {// 模拟耗时操作try { Thread.sleep(2000); } catch (InterruptedException ignored) {}return Arrays.asList(source + "-Material1", source + "-Material2");}}
import java.util.*;
import java.util.concurrent.*;public class ApplicationTest {public static void main(String[] args) {System.out.println("==================== begin ====================");long start = System.currentTimeMillis();CompletableFuture<List<String>> future1 = CompletableFuture.supplyAsync(() -> {return queryStrDatabase("Str");});System.out.println("==================== running ====================");CompletableFuture<List<Integer>> future2 = CompletableFuture.supplyAsync(() -> {return queryIntDatabase();});List<String> strList = null;try {strList = future1.get();} catch (InterruptedException | ExecutionException e) {System.out.println("Str is fail");}List<Integer> intList = null;try {intList = future2.get();} catch (InterruptedException | ExecutionException e) {System.out.println("Int is fail");}System.out.println(strList);System.out.println(intList);System.out.println(System.currentTimeMillis() - start);System.out.println("==================== end ====================");}// 模拟数据库查询方法private static List<String> queryStrDatabase(String source) {// 模拟耗时操作try { Thread.sleep(2000); } catch (InterruptedException ignored) {}return Arrays.asList(source + "-Material1", source + "-Material2", source + "-Material3");}// 模拟数据库查询方法private static List<Integer> queryIntDatabase() {// 模拟耗时操作try { Thread.sleep(2000); } catch (InterruptedException ignored) {}return Arrays.asList(11, 21, 31);}}

同步代码

所谓的同步代码,也就是从我们接受到请求直到请求返回都是由一个线程处理的,如果处理代码中有阻塞那么这个时候此线程就会阻塞,在请求量比较大的情况下,也就是并发场景,这个时候会有很多的请求发过来,那么tomcat只有两百的线程,如果线程阻塞时间较长,那么tomcat的线程会被全部阻塞,导致无法处理外部请求,进而系统的吞吐量就会很低。
在这里我举个实际生活中的场景,如果你要下单,那么需要调用 用户服务(查询用户信息)—>商品服务(查询商品信息)—>积分服务(修改积分)—>订单服务(生成订单)—>库存服务(减库存)。要完成这一个任务时,需要先完成任务1,再完成任务2,直到完成任务n。那么所消耗的时间就是 :time > 任务1 + 任务2 + … + 任务n。

伪代码模拟:

JSONPObject createOrder(Integer userId,Integer goodsId){// 1、调用用户服务,获取用户信息User user = getUserById(userId); // 2s// 2、调用商品服务,获取商品详情Goods goods = getGoodsById(goodsId); // 2s// 3、调用积分服务,修改积分updatePoints(userId);  // 2s// 4、调用订单服务,生成订单createOrderByUserAndGoods(user,goods); // 2s// 5、调用库存服务,修改库存updateInventoryByGoodsId(goodsId);  //2sreturn null;
}

对于这个场景,我们可以开启了四个线程处理,在这里我将订单服务放到了用户服务和商品服务完成之后处理,这里和你的系统设计有关系,也可以和其他服务同时并发处理,那么经过这次优化后,处理时间 time > 前四个服务中最长的 + 订单服务,这样既完成了代码串行问题的优化。
伪代码模拟:

JSONPObject createOrder2(Integer userId, Integer goodsId) {// 1、调用用户服务,获取用户信息CompletableFuture<User> future1 = CompletableFuture.supplyAsync(() -> {// 2sreturn getUserById(userId);});// 2、调用商品服务,获取商品详情CompletableFuture<Goods> future2 = CompletableFuture.supplyAsync(() -> {return getGoodsById(goodsId); // 2s});// 3、调用积分服务,修改积分CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {updatePoints(userId);  // 2s});// 4、调用订单服务,生成订单(在用户服务和商品服务调用结束后执行)CompletableFuture<Void> completableFuture = future1.thenCombineAsync(future2, (user, goods) -> {createOrderByUserAndGoods(user, goods); // 2sreturn null;});// 5、调用库存服务,修改库存CompletableFuture.runAsync(() -> {updateInventoryByGoodsId(goodsId);  //2s});return null;
}

相关文章:

CompletableFuture并行处理任务

CompletableFuture并行处理任务 CompletableFuture基本概念与特性创建CompletableFuture实例 任务编排方法线程池选择默认线程池自定义线程池线程池配置建议 代码示例同步代码 CompletableFuture 基本概念与特性 异步执行&#xff1a; CompletableFuture允许任务在后台线程中…...

【系统架构设计师】信息安全的概念

目录 1. 5个基本要素2. 范围2.1 设备安全2.2 数据安全2.3 内容安全2.4 行为安全 3. 例题3.1 例题1 1. 5个基本要素 1.信息安全包括5个基本要素:机密性、完整性、可用性、可控性与可审查性。2.机密性:确保信息不暴露给未授权的实体或进程。3.完整性:只有得到允许的人才能修改数…...

华为云获取IAM用户Token的方式及适用分析

&#x1f9e0; 一、为什么要获取 IAM 用户 Token&#xff1f; 我们用一个生活中的比喻来解释&#x1f447;&#xff1a; &#x1f3e2; 比喻场景&#xff1a; 你要去一个 高级写字楼&#xff08;华为云物联网平台&#xff09; 办事&#xff08;调用接口管理设备&#xff09;&…...

齐次坐标系下的变换矩阵

理解齐次坐标系下的变换矩阵 文章目录 理解齐次坐标系下的变换矩阵1 引言2 齐次坐标系的简要介绍2.1 齐次坐标系的定义2.2 为什么需要齐次坐标系&#xff1f;2.3 齐次坐标系的特殊性质2.3.1 点和向量的区分2.3.2 投影变换 3 齐次坐标系下的变换矩阵3.1 二维变换矩阵平移变换缩放…...

web原生API AbortController网络请求取消方法使用介绍:防止按钮重复点击提交得最佳方案

在前端开发中&#xff0c;取消网络请求是一个常见的需求&#xff0c;尤其是在用户频繁操作或需要中断长时间请求的场景下。 AbortController 主要用于 ​优雅地管理和取消异步操作&#xff1a; 浏览器原生 API 一、代码解析 1. ​创建 AbortController 实例 const controlle…...

74.搜索二维矩阵

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#x…...

基于Spring Boot+微信小程序的智慧农蔬微团购平台-项目分享

基于Spring Boot微信小程序的智慧农蔬微团购平台-项目分享 项目介绍项目摘要目录系统功能图管理员E-R图用户E-R图项目预览登录页面商品管理统计分析用户地址添加 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLSpringBoot微信小程序 项目摘要 随着…...

机器学习-08-推荐算法-协同过滤

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 23张图&#x…...

03-HTML常见元素

一、HTML常见元素 常见元素及功能&#xff1a; 元素用途<h1>~<h6>标题从大到小<p>段落&#xff0c;不同段落会有间距<img>显示图片&#xff0c;属性src为图片路径&#xff0c;alt为图片无法显示时的提示文本<a>超链接&#xff0c;属性href为链…...

LangChain + 文档处理:构建智能文档问答系统 RAG 的实战指南

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Lang Chain 2、文档问答的典型应用场景 二、文…...

深入理解 DML 和 DQL:SQL 数据操作与查询全解析

深入理解 DML 和 DQL&#xff1a;SQL 数据操作与查询全解析 在数据库管理中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是操作和查询数据的核心工具。其中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; 和 DQL&…...

头歌实训之SQL视图的定义与操纵

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

Excel/WPS表格中图片链接转换成对应的实际图片

Excel 超链图变助手&#xff08;点击下载可免费试用&#xff09; 是一款将链接转换成实际图片&#xff0c;批量下载表格中所有图片的转换工具&#xff0c;无需安装&#xff0c;双击打开即可使用。 表格中链接如下图所示&#xff1a; 操作方法&#xff1a; 1、双击以下图标&a…...

单例模式的使用场景 以及 饿汉式写法(智能指针)

单例模式的使用场景 以及 饿汉式写法&#xff08;智能指针&#xff09; 饿汉式&#xff1a;创建类时就已经创建好了类的实例&#xff08;用智能指针实现&#xff09;什么时候用单例模式&#xff1a;1. 全局配置管理2. 日志系统3. 资源管理器4. 硬件设备访问总结 饿汉式&#xf…...

示波器探头状态诊断与维护技术指南

一、探头性能劣化特征分析 信号保真度下降 ・时域表现&#xff1a;上升沿时间偏离标称值15%以上&#xff08;如1ns探头测得≥1.15ns&#xff09; ・频域特性&#xff1a;-3dB带宽衰减超过探头标称值20%基准稳定性异常 ・直流偏置电压漂移量&#xff1e;5mV&#xff08;预热30分…...

使用Matlab工具将RAW文件转化为TXT文件,用于FPGA仿真输入

FPGA实现图像处理算法时&#xff0c;通常需要将图像作为TestBench的数据输入。 使用VHDL编写TestBench时&#xff0c;只能读取二进制TXT文件。 现在提供代码&#xff0c;用于实现RAW图像读取&#xff0c;图像显示&#xff0c;图像转化为二进制数据并存入TXT文件中。 clc; cl…...

Missashe考研日记-day23

Missashe考研日记-day23 0 写在前面 博主前几天有事回家去了&#xff0c;断更几天了不好意思&#xff0c;就当回家休息一下调整一下状态了&#xff0c;今天接着开始更新。虽然每天的博客写的内容不算多&#xff0c;但其实还是挺费时间的&#xff0c;比如这篇就花了我40多分钟…...

视频分析设备平台EasyCVR安防视频小知识:安防监控常见故障精准排查方法

随着安防监控技术的飞速发展&#xff0c;监控系统已经成为现代安防体系中不可或缺的核心组成部分&#xff0c;广泛应用于安防监控、交通管理、工业自动化等多个领域。然而&#xff0c;监控系统的稳定运行高度依赖于设备的正确配置、线路的可靠连接以及电源的稳定供电。在实际应…...

Linux论坛安装

事前准备 1、Discuz_X3.5_SC_UTF8_20230520的压缩包。 2、一台虚拟机&#xff0c;xshell和xftp&#xff08;用来传输文件&#xff09; 安装httpd 软件并将压缩包移动到指定目录 mount /dev/sr0 /mnt #### 挂载光盘到 /mnt 目录 dnf install httpd -y ### 安装http…...

瑞吉外卖-分页功能开发中的两个问题

1.分页功能-前端页面展示显示500 原因&#xff1a;项目启动失败 解决&#xff1a;发现是Category实体类中&#xff0c;多定义了一个删除字段&#xff0c;但是我数据库里面没有is_deleted字段&#xff0c;导致查询数据库失败&#xff0c;所以会导致500错误。因为类是从网上其他帖…...

深入理解HotSpot JVM 基本原理

关于JAVA Java编程语言是一种通用的、并发的、面向对象的语言。它的语法类似于C和C++,但它省略了许多使C和C++复杂、混乱和不安全的特性。 Java 是几乎所有类型的网络应用程序的基础,也是开发和提供嵌入式和移动应用程序、游戏、基于 Web 的内容和企业软件的全球标准。. 从…...

[原理分析]安卓15系统大升级:Doze打盹模式提速50%,续航大幅增强,省电提升率5%

技术原理:借鉴中国友商思路缩短进入Doze的时序 开发者米沙尔・拉赫曼(Mishaal Rahman)在其博文中透露&#xff0c;谷歌对安卓15系统进行了显著优化&#xff0c;使得设备进入“打盹模式”(Doze Mode)的速度提升了50%&#xff0c;并且部分机型的待机时间因此得以延长三小时。设备…...

人工智能在慢病管理中的具体应用全集:从技术落地到场景创新

一、AI 赋能慢病管理:技术驱动医疗革新 1.1 核心技术原理解析 在当今数字化时代,人工智能(AI)正以前所未有的态势渗透进医疗领域,尤其是在慢性病管理方面,展现出巨大的潜力和独特优势。其背后依托的机器学习、深度学习、自然语言处理(NLP)以及物联网(IoT)与可穿戴设…...

视频生成上下文并行方案

在多张rtx4090上的并行生成方案,主要就是xdit和paraattention中的并行上下文注意力机制。希望找到一个和skyreel一致的para attn的并行方案。 1.ParaAttention https://github.com/chengzeyi/ParaAttentionhttps://github.com/chengzeyi/ParaAttention目前只支持了文生视频的…...

Unity接入安卓SDK(3)厘清Gradle的版本

接入过程中&#xff0c;很多人遇到gradle的各种错误&#xff0c;由于对各种gradle版本的概念不甚了了&#xff0c;模模糊糊一顿操作猛如虎&#xff0c;糊弄的能编译通过就万事大吉&#xff0c;下次再遇到又是一脸懵逼。所以我们还是一起先厘清gradle的版本概念。 1 明晰概念 …...

牛行为-目标检测数据集(包括VOC格式、YOLO格式)

牛行为-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接: https://pan.baidu.com/s/1hTLiiNOJYjzcejNwZpVsqA?pwdzhhb 提取码: zhhb 数据集信息介绍&#xff1a; 共有 8869张图像和一一对应的标注文件 标注文件格式提供了两种&#x…...

ubuntu 22.04 安装和配置 mysql 8.0,设置开机启动

# 更新软件包列表 sudo apt update && sudo apt upgrade -y # 安装MySQL 8.0 sudo apt install mysql-server-8.0 -y # 启动MySQL服务并设置开机启动 sudo systemctl start mysql sudo systemctl enable mysql # 安全安装MySQL&#xff0c;一路回车 sudo mysql…...

掌握Go空接口强大用途与隐藏陷阱

掌握Go空接口:强大用途与隐藏陷阱 Go语言中的空接口interface{}初看像是一种超能力工具。它能容纳任何东西——数字、字符串、结构体,应有尽有。但能力越大责任越大……如果不小心使用,它也会带来一堆麻烦。本文将深入探讨interface{}的工作原理,挖掘其合理的使用场景,并…...

CSS预处理工具有哪些?分享主流产品

目前主流的CSS预处理工具包括&#xff1a;Sass、Less、Stylus、PostCSS等。其中&#xff0c;Sass是全球使用最广泛的CSS预处理工具之一&#xff0c;以强大的功能、灵活的扩展性以及完善的社区生态闻名。Sass通过增加变量、嵌套、混合宏&#xff08;mixin&#xff09;等功能&…...

【2025面试Java常问八股之redis】zset数据结构的实现,跳表和B+树的对比

Redis 中的 ZSET&#xff08;Sorted Set&#xff0c;排序集合&#xff09;是一种非常重要的数据结构&#xff0c;它结合了集合&#xff08;Set&#xff09;和有序列表&#xff08;List&#xff09;的特点&#xff0c;能够存储一组 唯一 的元素&#xff0c;并且每个元素关联一个…...

VR制作攻略:如何制作VR

VR制作基础步骤 制作VR内容&#xff0c;特别是VR全景图&#xff0c;是一个涉及多个关键步骤的过程&#xff0c;包括设备准备、拍摄、拼接、后期处理及优化等。 以下将详细介绍这些步骤&#xff0c;并结合众趣科技的支持进行阐述。 1. 设备准备 相机&#xff1a; 选择配备广…...

Linux深度探索:进程管理与系统架构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由⼀个个的硬件组件组成。 输入设备&#xff1a;键盘&#xff0c;鼠标…...

240421 leetcode exercises

240421 leetcode exercises jarringslee 文章目录 240421 leetcode exercises[31. 下一个排列](https://leetcode.cn/problems/next-permutation/)什么是字典序&#xff1f;&#x1f501;二次遍历查找 [82. 删除排序链表中的重复元素 II](https://leetcode.cn/problems/remove…...

批量导出多个文件和文件夹名称与路径信息到Excel表格的详细方法

在数字化时代&#xff0c;电脑中的文件和文件夹管理变得越来越重要啦。没有对文件进行定期整理时&#xff0c;寻找文件会我们耗费大量的时间。为了高效查找文件或文件夹&#xff0c;可以将其名称和路径记录下来并整理成清单。然而&#xff0c;当文件夹数量非常多时&#xff0c;…...

基于亚马逊云科技 Amazon Bedrock Tool Use 实现 Generative UI

背景 在当前 AI 应用开发浪潮中&#xff0c;越来越多的开发者专注于构建基于大语言模型&#xff08;LLM&#xff09;的 chatbot 和 AI Agent。然而&#xff0c;传统的纯文本对话形式存在局限性&#xff0c;无法为用户提供足够直观和丰富的交互体验。为了增强用户体验&#xff…...

Buildroot、BusyBox与Yocto:嵌入式系统构建工具对比与实战指南

文章目录 Buildroot、BusyBox与Yocto:嵌入式Linux系统构建工具完全指南一、为什么需要这些工具?1.1 嵌入式系统的特殊性1.2 传统开发的痛点二、BusyBox:嵌入式系统的"瑞士军刀"2.1 什么是BusyBox?2.2 核心功能2.3 安装与使用2.4 典型应用场景三、Buildroot:自动…...

Android 最简单的native二进制程序

Android.bp cc_binary {name: "my_native_bin",srcs: ["main.cpp"],cflags: ["-Wall", // 启用标准警告"-Werror", // 将警告视为错误"-fPIE", // 生成位置无关代码"-pie", …...

VR、AR、互动科技:武汉数字展馆制作引领未来展览新体验

在科技飞速发展的今天&#xff0c;数字化技术正以前所未有的速度渗透到各个领域&#xff0c;展馆行业也不例外。数字展馆&#xff0c;作为一种新兴的展示形式&#xff0c;正逐渐走进大众的视野&#xff0c;成为当下展馆发展的新潮流。 那么&#xff0c;究竟什么是数字展馆呢&am…...

从代码学习深度学习 - 学习率调度器 PyTorch 版

文章目录 前言一、理论背景二、代码解析2.1. 基本问题和环境设置2.2. 训练函数2.3. 无学习率调度器实验2.4. SquareRootScheduler 实验2.5. FactorScheduler 实验2.6. MultiFactorScheduler 实验2.7. CosineScheduler 实验2.8. 带预热的 CosineScheduler 实验三、结果对比与分析…...

Kotlin安卓算法总结

Kotlin 安卓算法优化指南 排序算法优化 1. 快速排序 // 使用三向切分的快速排序&#xff0c;对包含大量重复元素的数组更高效 fun optimizedQuickSort(arr: IntArray, low: Int 0, high: Int arr.lastIndex) {if (high < low) returnvar lt lowvar gt highval pivot …...

Eteam 0.3版本开发规划

Eteam 0.1系列经历了3个小版本&#xff0c;主要完成了团队资料库功能。 Eteam 0.2系列经历了22个小版本&#xff0c;主要完成了白板和AI交互的能力。 目前的问题 目前白板上的数据有两个来源&#xff0c;团队资料库和外部数据。外部数据和团队资料库数据边界不是很清晰。 0.3版…...

每天五分钟机器学习:凸优化

本文重点 凸优化作为一类特殊的数学优化问题,因其理论完备性和计算高效性,在人工智能领域发挥着至关重要的作用。从经典的逻辑回归到深度神经网络的初始化,从支持向量机的核技巧到强化学习的策略优化,凸优化理论不仅为算法提供了坚实的数学基础,还直接推动了人工智能模型…...

PyTorch与TensorFlow模型全方位解析:保存、加载与结构可视化

目录 前言一、保存整个模型二、pytorch模型的加载2.1 只保存的模型参数的加载方式&#xff1a;2.2 保存结构和参数的模型加载三、pytorch模型网络结构的查看3.1 print3.2 summary3.3 netron3.3.1 解决方法13.3.2 解决方法23.4 TensorboardX四、tensorflow 框架的线性回归4.1 …...

【图像变换】pytorch-CycleGAN-and-pix2pix的学习笔记

1. 问题记录 &#xff08;1&#xff09;在2080Ti上训练时模型“卡在了第63个epoch”没有任何变换 我们观察到模型一直卡在这里&#xff0c;“像静止了一样”没有任何变化&#xff1b; 也查看了一下显卡情况&#xff0c;看到显存占用为0%&#xff0c;如图所示&#xff0c;...

微信小程序 == 倒计时验证码组件 (countdown-verify)

组件介绍 这是一个用于获取验证码的倒计时按钮组件&#xff0c;支持自定义倒计时时间、按钮样式和文字格式。 基本用法 <countdown-verify seconds"60"button-text"获取验证码"bind:send"onSendVerifyCode" />属性说明 属性名类型默认…...

Ldap高效数据同步- Delta-Syncrepl复制模式配置实战手册(上)

#作者&#xff1a;朱雷 文章目录 一、Syncrepl 和Delta-syncrepl 回顾对比1.1. 什么是复制模式1.2. 什么是 syncrepl同步复制1.3. syncrepl同步复制的缺点1.4. 什么是Delta-syncrepl 复制 二、Ldap环境部署三、配置复制类型3.1. 编译安装3.2. 提供者端配置 一、Syncrepl 和Del…...

【Hive入门】Hive概述:大数据时代的数据仓库桥梁

目录 1 Hive概述&#xff1a;连接SQL世界与Hadoop生态 2 从传统数据仓库到Hive的演进之路 2.1 传统数据仓库的局限性 2.2 Hive的革命性突破 3 Hive的核心架构与执行流程 3.1 Hive系统架构 3.2 SQL查询执行全流程 4 Hive与传统方案的对比分析 5 Hive最佳实践 5.1 存储…...

靠华为脱胎换骨,但赛力斯仍需要Plan B

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年底&#xff0c;撒贝宁在央视的一场直播中&#xff0c;终于“按捺不住”问了赛力斯董事长张兴海一个好奇已久的问题——“与华为合作之后&#xff0c;晚上是不是乐得睡不着觉&#xff1f;” “睡觉的时候还是该睡觉......不…...

【ESP32】【微信小程序】MQTT物联网智能家居案例

这里写自定义目录标题 案例成果1.Ardino写入部分2.微信小程序JS部分3.微信小程序xml部分4. 微信小程序CSS部分 案例成果 1.Ardino写入部分 #include <WiFi.h> // ESP32 WiFi库 #include <PubSubClient.h> // MQTT客户端库 #include <DHT.h> …...

应用层核心协议详解:HTTP, HTTPS, RPC 与 Nginx

应用层核心协议详解&#xff1a;HTTP, HTTPS, RPC 与 Nginx 前言一、HTTP&#xff1a;Web的基石1.1 HTTP协议的核心特点1.2 HTTP 报文格式1.3 HTTP 方法 (Methods)1.4 HTTP 状态码 (Status Codes)1.5 连接管理&#xff1a;短连接 vs 长连接1.6 HTTP 版本演进1.7 状态管理&#…...