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

性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

        本文比较了 Spring Boot 应用程序中的不同请求处理方法:ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。

        在本文中,我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。
        高效的请求处理在开发高性能后端应用程序中起着至关重要的作用。传统上,大多数开发人员使用 Spring Boot 应用程序中嵌入的 Tomcat,其默认线程池用于在后台处理请求。然而,替代方法近年来越来越受欢迎。WebFlux 利用事件循环进行响应式请求处理,而 Kotlin 协程及其suspend功能也越来越受到青睐。
        此外,引入虚拟线程的 Project Loom 预计将在 Java 21 中发布。不过,尽管 Java 21 尚未发布,但从 Java 19 开始我们就已经可以尝试 Project Loom 了。因此,在本文中,我们还将探索使用虚拟线程来处理请求。
        此外,我们将使用JMeter 进行高负载测试的不同请求处理方法进行性能比较。

性能测试模型

我们将使用以下模型来比较请求处理方法:

性能测试模型

流程就像蛋糕一样简单:

  • 客户端(JMeter)将并行发送 500 个请求。每个线程将等待响应,然后重复发送另一个请求。请求超时时间为 10 秒。测试时间将持续1分钟。
  • 我们正在测试的 Spring Boot 应用程序将接收来自客户端的请求并等待来自慢速服务器的响应。
  • 慢速服务器以随机超时响应。最大响应时间为 4 秒。平均响应时间为2秒。

处理的请求越多,性能结果就越好。

 

1. 线程池

默认情况下,Tomcat 使用线程池(有时称为连接池)来处理请求。
概念很简单:当请求到达 Tomcat 时,它会从线程池中分配一个线程来处理该请求。该分配的线程将保持阻塞状态,直到生成响应并将其发送回客户端。
默认情况下,线程池最多包含 200 个线程。这基本上意味着单个时间点只能处理 200 个请求。
但这个参数和其他参数是可配置的。

默认线程池

让我们对一个带有嵌入式 Tomcat 和默认线程池的简单 Spring Boot 应用程序进行性能测量。

线程池容纳 200 个线程。对于每个请求,服务器都会对另一台服务器进行阻塞调用,平均响应时间为两秒。因此我们可以预计每秒 100 个请求的吞吐量。

请求总数
吞吐量,请求/秒
响应时间,毫秒
错误率,%
平均的
最小
90%线
最大限度
3356
91.2
4787
155
6645
7304
0.00

值得注意的是,实际结果非常接近,测得的吞吐量为每秒 91.2 个请求。 

增加线程池 

让我们使用应用程序属性将线程池中的最大线程数增加到 400:

server:tomcat:threads:max: 400
 

让我们再次运行测试:

请求总数吞吐量,请求/秒响应时间,毫秒错误率,%
平均的最小90%线最大限度
6078176.7254910418448550.00

预计线程池中的线程数量加倍将使吞吐量提高两倍。

但请注意,在不考虑系统容量和资源限制的情况下增加线程池中的线程数量可能会对性能、稳定性和整体系统行为产生不利影响。根据系统的具体要求和功能仔细调整和优化线程池大小至关重要。

2.WebFlux

WebFlux 没有为每个请求分配专用线程,而是采用具有少量线程的事件循环模型,通常称为事件循环组。这使得它能够用有限数量的线程处理大量并发请求。请求是异步处理的,事件循环可以利用非阻塞 I/O 操作有效地同时处理多个请求。WebFlux非常适合需要高可扩展性的场景,例如处理大量长连接或流数据。
理想情况下,WebFlux 应用程序应该完全以响应式方式编写;有时,这并不那么容易。但我们有一个简单的应用程序,我们可以只使用WebClient 来调用慢速服务器。

@Bean
public WebClient slowServerClient() {return WebClient.builder().baseUrl("http://127.0.0.1:8000").build();
}

在 Spring WebFlux 的上下文中, RouterFunction 是请求映射和处理的另一种方法:

@Bean
public RouterFunction<ServerResponse> routes(WebClient slowServerClient) {return route(GET("/"), (ServerRequest req) -> ok().body(slowServerClient.get().exchangeToFlux(resp -> resp.bodyToFlux(Object.class)),Object.class));
}

但仍然可以使用传统控制器。

那么,让我们运行测试:

请求总数吞吐量,请求/秒响应时间,毫秒错误率,%
平均的最小90%线最大限度
7443219.2206812369943810.00

结果甚至比增加线程池的情况更好。但需要注意的是,线程池和 WebFlux 都有各自的优点和缺点,选择取决于具体要求、工作负载的性质以及开发团队的专业知识。

3. 协程和WebFlux

Kotlin协程 可以有效地用于请求处理,以更加并发和非阻塞的方式提供替代方法。
Spring WebFlux支持 协程来处理请求,所以让我们尝试编写这样一个控制器:

@GetMapping
suspend fun callSlowServer(): Flow<Any> {return slowServerClient.get().awaitExchange().bodyToFlow(String::class)
}

挂起函数可以执行长时间运行或阻塞操作,而不会阻塞底层线程。Kotlin 协程基础知识文章很好地描述了基础知识。

那么,让我们再次运行测试:

请求总数吞吐量,请求/秒响应时间,毫秒错误率,%
平均的最小90%线最大限度
7481220.420645361540490.00

粗略地,我们可以得出这样的结论:结果与没有协程的 WebFlux 应用程序的情况没有什么不同。

但除了协程之外,还使用了相同的WebFlux,测试可能并没有完全揭示出协程的潜力。下次,值得尝试Ktor。

4. 虚拟线程(Project Loom)

虚拟线程或纤维是Project Loom引入的概念。
与本机线程相比,虚拟线程的内存占用量显着降低,允许应用程序创建和管理更多数量的线程,而不会耗尽系统资源。它们可以更快地创建和切换,从而减少与线程创建相关的开销。
虚拟线程执行的切换由 Java 虚拟机 (JVM) 内部处理,可以在以下位置完成:
自愿挂起:虚拟线程可以使用Thread.sleep()或等方法显式挂起其执行CompletableFuture.await()。当虚拟线程自行挂起时,执行会暂时暂停,JVM 可以切换到执行另一个虚拟线程。
阻塞操作:当虚拟线程遇到阻塞操作,例如等待I/O或获取锁时,可以自动挂起。这允许 JVM 通过使用底层本机线程执行其他准备运行的虚拟线程来更有效地利用它们。
如果您对虚拟线程和载体线程主题感兴趣,请阅读 DZone 上这篇精彩的文章 — Java 虚拟线程 — 简单介绍。
虚拟线程最终将在 Java 21 中发布,但从 Java 19 开始我们就已经可以测试它们了。我们只需要显式指定 JVM 选项即可。

基本上,我们要做的就是用一些基于虚拟线程的执行器替换 Tomcat 线程池:

@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandler() {return protocolHandler ->protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}

因此,我们开始使用虚拟线程,而不是线程池执行器。

让我们运行测试:

请求总数吞吐量,请求/秒响应时间,毫秒错误率,%
平均的最小90%线最大限度
7427219.3208012369340740.00

结果实际上与 WebFlux 的情况相同,但我们根本没有使用任何反应式技术。即使对于慢速服务器的调用,也使用常规阻塞 RestTemplate。我们所做的就是用虚拟线程执行器替换线程池。

结论

让我们将测试结果收集到一张表中:

请求处理程序
30 秒内的请求总数
吞吐量,请求/秒响应时间,毫秒错误率,%
平均的最小90%线最大限度
线程池(200 个线程)335691.24787155664573040.00
增加线程池(400 个线程)6078176.7254910418448550.00
WebFlux7443219.22068123699943810.00
WebFlux + 协程7481220.420645361540490.00
虚拟线程(Project Loom)7427219.3208012369340740.00

本文进行的性能测试比较肤浅,但我们可以得出一些初步结论:

  • 线程池表现出较差的性能结果。增加线程数量可能会带来改进,但应考虑系统的容量和资源限制。尽管如此,线程池仍然是一个可行的选择,特别是在处理大量阻塞操作时。
  • WebFlux 展示了非常好的结果。但值得注意的是,要充分受益于其性能。整个代码应该以响应式风格编写。 
  • 将协程与 WebFlux 结合使用会产生类似的性能结果。也许我们必须使用 Ktor 来尝试它们,Ktor 是一个专门为利用协程的力量而设计的框架。 
  • 使用虚拟线程(Project Loom)也产生了类似的结果。然而,值得注意的是,我们没有修改代码或采用任何反应技术。唯一的改变是用虚拟线程执行器替换线程池。尽管很简单,但与使用线程池相比,性能结果显着提高。 

因此,我们可以初步得出结论,Java 21中虚拟线程的发布将显着改变现有服务器和框架中请求处理的方法。

相关文章:

性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

本文比较了 Spring Boot 应用程序中的不同请求处理方法&#xff1a;ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。 在本文中&#xff0c;我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。 高效的请求处理在开发高性能后端…...

rust学习-打印结构体中的vec

write! 宏 将格式化后的数据写入到一个缓冲区&#xff08;buffer&#xff09;&#xff0c;而不是直接打印到标准输出或文件中。 这个缓冲区可以是字符串&#xff0c;也可以是需要写入的文件的缓冲区。 write!(writer, format_string, expr1, expr2, ...);writer 参数是一个实…...

FPGA: RS译码仿真过程

FPGA: RS译码仿真过程 在上一篇中记录了在FPGA中利用RS编码IP核完成信道编码的仿真过程&#xff0c;这篇记录利用译码IP核进行RS解码的仿真过程&#xff0c;带有程序和结果。 1. 开始准备 在进行解码的过程时&#xff0c;同时利用上一篇中的MATLAB仿真程序和编码过程&#x…...

PostgreSQL 查询数据表、视图信息

--获得指定schema范围内的所有表和视图的列表&#xff0c;可指定一个排除表前缀模式with param as (select public,iit as schema_name,db2g% as exclude_pattern),base_info as (--获得所有基表select pg_namespace.nspname as schema_name, a.relname as tbl_name ,TBL as tb…...

手撕vector容器

一、vector容器的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素&#xff0c;但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自动处理。 总结&#xff1a;vector是一个动态…...

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序&#xff0c;用于将PDF文件转换为旋转90度的PDF文件。主要用于csdn网站中导出的博客pdf是横向的&#xff0c;看起来不是很方便&#xff0c;才想到用python编制一个将pdf从横向转为纵向的功能。 功能 该PDF转换工具具有以下功能&#xff1a…...

微人事 登录问题完善

重启服务端的时候&#xff0c;发现前端页面会操作不了&#xff0c;这样后端session会失效&#xff0c;我们就需要让页面重新跳转到登录页 springsecurity配置类后端配置 前端拦截器进行拦截跳转...

【业务功能篇64】安装docker容器,在docker上安装mysql

docker教程&#xff1a; https://www.runoob.com/docker/docker-tutorial.html卸载docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker docker-client docker-client-latest docker-co…...

MyBatis的基本概念和核心组件

MyBatis的基本概念 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的 POJOs(Pla…...

sql update执行返回0,能否判断数据不存在

答案&#xff1a;不能。 update执行返回0的情况 1、没有找到需要更新的数据&#xff0c;就是这条记录不存在 例如&#xff1a;where后面的条件是id0&#xff0c;那这条记录肯定是不存在的&#xff0c;返回结果是0 2、更新时的数据和要更新的数据完全一致时 例如&#xff1a;更…...

数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例

1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上&#xff0c;还可以与sklearn-optimize结合使用&#xff0c;这也是我最喜欢的地方&#xff0c;Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…...

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明&#xff1a;这个buzzer的额定电压需要改为3V&#xff0c;否则不会叫&#xff0c;源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…...

打印X型的图案

int main() {int n0;int i0;int j0;scanf("%d",&n);for(i0;i<n;i){for(j0;j<n;j){if(ij){printf("*");}else if((ij)n-1){printf("*");}elseprintf(" ");}printf("\n");}return 0; }...

不含数字的webshell绕过

异或操作原理 1.首先我们得了解一下异或操作的原理 在php中&#xff0c;异或操作是两个二进制数相同时&#xff0c;异或(相同)为0&#xff0c;不同为1 举个例子 A的ASCII值是65&#xff0c;对应的二进制值是0100 0001 的ASCII值是96&#xff0c;对应的二进制值是 0110 000…...

Mac上传项目源代码到GitHub的修改更新

Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github&#xff0c;不得不说&#xff0c;真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先&#xff0c;在本地终端命令行打开至项目文件下第一步&#xff1a;查看当前的git仓库状态&#xff0c;可以使用git…...

Android6:片段和导航

创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…...

ClickHouse AST is too big 报错问题处理记录

ClickHouse AST is too big 报错问题处理记录 问题描述问题分析解决方案1、修改系统配置2、修改业务逻辑 问题描述 项目中统计报表的查询出现 AST is too big 问题&#xff0c;报错信息如下&#xff1a; 问题分析 报错信息显示 AST is too big。 AST 表示查询语法树中的最大…...

DPDK系列之二十七DIDO

一、DIDO介绍 随着计算机技术发展&#xff0c;特别是应用技术的快速发展。应用场景对计算机的处理速度几乎已经到了疯狂的地步。说句大白话&#xff0c;再快的CPU也嫌慢。没办法&#xff0c;CPU和IO等技术基本目前都处在了瓶颈之处&#xff0c;大幅度提高&#xff0c;短时间内…...

《游戏编程模式》学习笔记(七)状态模式 State Pattern

状态模式的定义 允许对象在当内部状态改变时改变其行为&#xff0c;就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器&#xff0c;实现跳跃功能 直觉上来说&#xff0c;我们代码会这么写&#xff1a; void Heroine::handleInput(Input input…...

博客系统之功能测试

博客系统共有&#xff1a;用户登录功能、发布博客功能、查看文章详情功能、查看文章列表功能、删除文章功能、退出功能 1.登录功能&#xff1a; 1.1测试对象&#xff1a;用户登录 1.2测试用例 方法&#xff1a;判定表 用例 编号 操作步骤预期结果实际结果截图1 1.用户名正确…...

CJS和 ES6 的语法区别

CommonJS 使用 module.exports 导出模块。ES6 使用 export 导出模块。 示例代码&#xff1a; CommonJS&#xff08;CJS&#xff09;模块的导出&#xff1a; // 导出模块 module.exports {foo: bar,baz: function() {return qux;} }; ES6 模块的导出&#xff1a; // 导出模…...

ArcGIS Pro如何制作不规则形状图例

在默认的情况下&#xff0c;ArcGIS Pro生成的图例是标准的点、直线和矩形的&#xff0c;对于湖泊等要素而言&#xff0c;这样的表示方式不够直观&#xff0c;我们可以将其优化一下&#xff0c;制作不规则的线和面来代替原有图例&#xff0c;这里为大家介绍一下制作方法&#xf…...

微软Win11 Dev预览版Build23526发布

近日&#xff0c;微软Win11 Dev预览版Build23526发布&#xff0c;修复了不少问题。牛比如斯Microsoft&#xff0c;也有这么多bug&#xff0c;所以你写再多bug也不作为奇啊。 主要更新问题 [开始菜单&#xff3d; 修复了在高对比度主题下&#xff0c;打开开始菜单中的“所有应…...

【NEW】视频云存储EasyCVR平台H.265转码配置增加分辨率设置

关于视频分析EasyCVR视频汇聚平台的转码功能&#xff0c;我们在此前的文章中也介绍过不少&#xff0c;感兴趣的用户可以翻阅往期的文章进行了解。 安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各…...

【数据结构】如何用队列实现栈?图文详解(LeetCode)

LeetCode链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言&#xff0c;不能直接使用队…...

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…...

C语言刷题训练DAY.9

1.线段图案 解题思路&#xff1a; 这里非常简单&#xff0c;我们只需要用一个循环控制打印即可。 解题代码&#xff1a; #include<stdio.h> int main() {int n 0;while ((scanf("%d", &n)) ! EOF){int i 0;for (i 0; i < n; i){printf("*&…...

CTFHub php://input

1.首先看代码&#xff1a; 这里其实就应该想到的是php://伪协议&#xff1a; php://filter、php://input、php://filter用于读取源码 php://input用于执行php代码 2.其次&#xff0c;判断使用php://input伪协议 而执行php://input伪协议条件是allow_url_include是On 可以先利用…...

React Native expo项目修改应用程序名称

https://expo.dev/accounts/xutongbao/projects npm install --global eas-cli && \eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 app.config.js: export default {name: 学习,slug: learn-gpt,owner: x…...

unity 之Transform组件(汇总)

文章目录 理论指导结合例子 理论指导 当在Unity中处理3D场景中的游戏对象时&#xff0c;Transform 组件是至关重要的组件之一。它管理了游戏对象的位置、旋转和缩放&#xff0c;并提供了许多方法来操纵和操作这些属性。以下是关于Transform 组件的详细介绍&#xff1a; 位置&a…...

基于Opencv的虚拟拖拽项目

预备知识 勾股定理 跟随移动算法 手势识别图解 项目源代码 """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流 2、在视频图像上画一个方块 3、通过mediapipe库获取手指关节坐标 4、判断手指是否在方块上 5、是&#xff0c;方块跟着移动 6、…...

基于单片机DHT11温湿度NRF2401无线通信控制系统

一、系统方案 本设计采用STC89C5单片机作为主控制器&#xff0c;从机采用DHT11传感器采集温湿度、按键设置报警阀值&#xff0c;液晶1602显示&#xff0c;蜂鸣器报警&#xff0c;无线NRF2401模块。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统…...

AutoSAR配置与实践(基础篇)2.5 RTE对数据一致性的管理

传送门 点击返回 ->AUTOSAR配置与实践总目录 AutoSAR配置与实践&#xff08;基础篇&#xff09;2.5 RTE对数据一致性的管理 一、 数据一致性问题引入二、 数据一致性的管理2.1 RTE管理 (SWC间)2.2 中断保护 (SWC内)2.3 变量保护IRVS (SWC内)2.4 Task分配2.5 任务抢占控制 一…...

ASP.NET WEB API通过SugarSql连接MySQL数据库

注意&#xff1a;VS2022企业版可以&#xff0c;社区版可能存在问题。实体名称和字段和数据库中的要一致。 1、创建项目&#xff0c;安装SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件结构 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …...

08-微信小程序视图层

08-微信小程序视图层 文章目录 视图层 ViewWXML数据绑定列表渲染条件渲染模板引用importimport 的作用域include WXSS尺寸单位样式导入内联样式选择器全局样式与局部样式 WXS注意事项页面渲染数据处理 视图层 View 框架的视图层由 WXML 与 WXSS 编写&#xff0c;由组件来进行…...

[机器学习]特征工程:特征降维

特征降维 1、简介 特征降维是指通过减少特征空间中的维度&#xff0c;将高维数据映射到一个低维子空间的过程。 在机器学习和数据分析中&#xff0c;特征降维可以帮助减少数据的复杂性、降低计算成本、提高模型性能和可解释性&#xff0c;以及解决维度灾难等问题。特征降维通…...

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…...

css层叠关系

文章目录 cascading声明冲突应用重置样式表a元素的类选择器顺序问题 cascading cascading – 层叠 解决声明冲突的过程&#xff0c;浏览器会自动处理&#xff1b;就是计算样式的权重&#xff0c;权重大的就被选择&#xff1b; 声明冲突 是指多个选择器选中同一个标签&#x…...

【Unity实战篇 】| 如何在小游戏中快速接入一个新手引导教程

前言 【Unity实战篇 】 | 如何在小游戏中快速接入一个新手引导教程一、简单教程描述二、接入Tutorial Master 实现游戏引导2.1 导入Tutorial Master2插件2.2 添加TutorialMasterManager脚本对象2.3 配置Tutorial&#xff0c;用于管理第一段引导内容2.4 配置Stage&#xff0c;用…...

Lookup Singularity

1. 引言 Lookup Singularity概念 由Barry WhiteHat在2022年11月在zkResearch论坛 Lookup Singularity中首次提出&#xff1a; 其主要目的是&#xff1a;让SNARK前端生成仅需做lookup的电路。Barry预测这样有很多好处&#xff0c;特别是对于可审计性 以及 形式化验证&#xff…...

idea 本地版本控制 local history

idea 本地版本控制 local history 如何打开 1 自定义快捷键 settings->keymap->搜索框输入 show history -》Add Keyboard Shortcut -》设置为 CtrlAltL 2 右键文件-》local history -》show history 新建文件 版本1&#xff0c;creating class com.geekmice…这个是初…...

【Freertos基础入门】深入浅出freertos互斥量

文章目录 前言一、互斥量是什么&#xff1f;二、互斥量的使用场景三、互斥量的使用1.创建 2.删除互斥量3.give和take四、示例代码总结 前言 FreeRTOS是一款开源的实时操作系统&#xff0c;提供了许多基本的内核对象&#xff0c;其中包括互斥锁&#xff08;Mutex&#xff09;。…...

皮爷咖啡基于亚马逊云科技的数据架构,加速数据治理进程

皮爷咖啡&#xff08;Peet’s Coffee&#xff09;是美国精品咖啡品牌&#xff0c;于2017年进入中国&#xff0c;为中国消费者带来传统经典咖啡饮品&#xff0c;并特别呈现更加丰富的品质咖啡饮品体验。通过深入应用亚马逊云科技云原生数据库产品Amazon Redshift以及Amazon DMS等…...

C++ string类详解

⭐️ string string 是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本一致&#xff0c;还有一些额外的操作 string 的常规操作&#xff0c;在使用 string 类时&#xff0c;需要使用 #include <string> 以及 using namespace std;。 ✨ 帮助文档&…...

深入浅出Pytorch函数——torch.nn.init.ones_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

一、docker及mysql基本语法

文章目录 一、docker相关命令二、mysql相关命令 一、docker相关命令 &#xff08;1&#xff09;拉取镜像&#xff1a;docker pull <镜像ID/image> &#xff08;2&#xff09;查看当前docker中的镜像&#xff1a;docker images &#xff08;3&#xff09;删除镜像&#x…...

【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时&#xff0c;会向外广播自己的 mac 地址和 ip 地址&#xff0c;这个即称为 arp 协议。范围是未经过路由器的部分&#xff0c;如下图的蓝色部分&#xff0c;范围内的设备都会在本地记录 mac 和 ip 的绑定信息&#xff0c;若有重复则覆盖更新&#xff08;例如先收到 ma…...

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想使…...

回归预测 | MATLAB实现BO-SVM贝叶斯优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BO-SVM贝叶斯优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现BO-SVM贝叶斯优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计…...

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…...