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

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

1. GrpcChannel 的概念

GrpcChannelgRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多个请求。

特点

  • 高消耗:创建 gRPC 通道可能涉及 DNS 解析、SSL 握手、连接认证等,耗时较高。
  • 长连接:gRPC 通道是长连接,在生命周期内可以复用。
  • 线程安全:gRPC 通道是线程安全的,多个线程可以共享一个通道发送请求。

2. 为什么需要 GrpcChannelPool

在高并发场景中,如果每个请求都创建一个新的 GrpcChannel,会导致以下问题:

  1. 资源消耗大:频繁创建和销毁通道会增加系统开销(如网络连接、CPU 和内存使用)。
  2. 性能瓶颈:SSL 握手、认证等操作可能导致响应时间变长。
  3. 连接浪费:大多数情况下,一个 gRPC 通道可以复用多个请求。

为了解决上述问题,引入连接池管理 GrpcChannel,实现通道的复用。


3. GrpcChannelPool 的作用

GrpcChannelPool 的主要功能是:

  1. 通道复用:通过复用 GrpcChannel,减少创建和销毁的开销。
  2. 资源管理:限制活跃和空闲连接的数量,避免资源耗尽。
  3. 性能优化:通过预热和连接验证机制,确保请求的响应速度和可靠性。

4. GrpcChannelPool 的实现

实现方式

GrpcChannelPool 通常基于 Apache Commons Pool,使用 GenericObjectPool 来管理连接池。以下是主要组件:

  1. GrpcChannelFactory:

    • 实现 PooledObjectFactory<GrpcChannel> 接口。
    • 负责创建、销毁和验证 GrpcChannel
  2. GenericObjectPool:

    • 提供连接池的核心功能,包括对象的借用(borrowObject)、归还(returnObject)、空闲检测等。

代码示例

1. 定义 GrpcChannelFactory
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;public class GrpcChannelFactory implements PooledObjectFactory<ManagedChannel> {private final String target;public GrpcChannelFactory(String target) {this.target = target;}@Overridepublic PooledObject<ManagedChannel> makeObject() {ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();return new DefaultPooledObject<>(channel);}@Overridepublic void destroyObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();channel.shutdown();}@Overridepublic boolean validateObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();return !channel.isShutdown() && !channel.isTerminated();}@Overridepublic void activateObject(PooledObject<ManagedChannel> p) {// 可选的激活逻辑}@Overridepublic void passivateObject(PooledObject<ManagedChannel> p) {// 可选的钝化逻辑}
}
2. 配置 GrpcChannelPool
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class GrpcChannelPool {private final GenericObjectPool<ManagedChannel> pool;public GrpcChannelPool(String target) {GrpcChannelFactory factory = new GrpcChannelFactory(target);GenericObjectPoolConfig<ManagedChannel> config = new GenericObjectPoolConfig<>();config.setMaxTotal(50);          // 最大活跃连接数config.setMinIdle(5);           // 最小空闲连接数config.setMaxIdle(10);          // 最大空闲连接数config.setTimeBetweenEvictionRunsMillis(30000); // 空闲检测周期config.setTestOnBorrow(true);  // 借用时验证config.setTestWhileIdle(true); // 空闲时验证pool = new GenericObjectPool<>(factory, config);}public ManagedChannel borrowChannel() throws Exception {return pool.borrowObject();}public void returnChannel(ManagedChannel channel) {pool.returnObject(channel);}
}
3. 使用 GrpcChannelPool
public class GrpcClient {public static void main(String[] args) throws Exception {GrpcChannelPool channelPool = new GrpcChannelPool("localhost:50051");// 借用一个通道ManagedChannel channel = channelPool.borrowChannel();// 使用通道发送 gRPC 请求// 示例代码:// MyGrpcServiceGrpc.MyGrpcServiceBlockingStub stub = MyGrpcServiceGrpc.newBlockingStub(channel);// stub.myRpcMethod();// 归还通道channelPool.returnChannel(channel);}
}

5. GrpcChannelPool 的参数配置

  • maxTotal:最大活跃连接数,限制并发连接的数量。
  • minIdle:最小空闲连接数,确保有预热的连接可以立即使用。
  • maxIdle:最大空闲连接数,避免空闲连接占用过多资源。
  • timeBetweenEvictionRunsMillis:空闲检测周期,定期清理无效连接。
  • testOnBorrow:借用连接时验证有效性,避免借用无效连接。
  • testWhileIdle:空闲检测时验证连接有效性,确保空闲连接的健康状态。

6. GrpcChannelPool 的优点

  1. 提高性能

    • 减少频繁创建和销毁 gRPC 通道的开销。
    • 确保在高并发场景下能够快速响应。
  2. 降低资源消耗

    • 通过复用通道和限制连接数量,避免资源浪费。
  3. 增强可靠性

    • 通过验证和检测机制,确保连接池中的通道始终处于健康状态。
  4. 支持动态调整

    • 根据负载情况灵活调整池的大小,满足不同场景需求。

7. GrpcChannelPool 在调用 borrowObject 时触发的方法

在调用 borrowObject 方法时,可能触发以下方法:

A. makeObject

  • 触发条件
    • 当池中没有空闲对象,且当前活跃对象数小于 maxTotal 时,会调用此方法创建新对象。
  • 作用
    • 创建并包装一个新的 GrpcChannel 对象。
  • 示例
    @Override
    public PooledObject<ManagedChannel> makeObject() {ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();return new DefaultPooledObject<>(channel);
    }
    

B. validateObject

  • 触发条件
    • testOnBorrow 设置为 true 时,每次调用 borrowObject 都会触发此方法。
  • 作用
    • 验证对象是否处于健康状态,例如 GrpcChannel 是否已关闭或异常。
    • 如果验证失败,该对象会被销毁。
  • 示例
    @Override
    public boolean validateObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();return !channel.isShutdown() && !channel.isTerminated();
    }
    

C. activateObject

  • 触发条件
    • 在对象被借出时会调用此方法(如果需要)。
  • 作用
    • 激活对象,例如初始化某些状态或设置上下文信息。
  • 示例
    @Override
    public void activateObject(PooledObject<ManagedChannel> p) {System.out.println("Activating gRPC Channel: " + p.getObject());
    }
    

D. passivateObject

  • 作用
    • 当对象被归还到池中时,passivateObject 方法会被触发,用于将对象的状态重置为初始状态。

8. 调用流程总结

  1. 检查空闲对象是否可用:如果池中有空闲对象,尝试直接获取。
  2. 验证对象有效性:通过 validateObject 检查对象状态(取决于配置)。
  3. 激活对象:调用 activateObject 进行状态初始化(如果需要)。
  4. 创建新对象:如果没有可用对象且未达 maxTotal,调用 makeObject 创建新对象。

通过合理配置参数和优化对象工厂逻辑,可以有效提高 borrowObject 的性能和可靠性。


GrpcChannelPool 方法耗时分析及优化

1. 可能耗时的方法

A. makeObject(创建对象)

  • 耗时原因

    • 创建 GrpcChannel 涉及:
      1. DNS 解析:在创建连接时需要解析目标服务器地址。
      2. 网络连接:与服务器建立 HTTP/2 连接。
      3. SSL/TLS 握手(如果启用加密):握手过程会增加额外的网络延迟。
      4. 认证过程(可选):如果使用身份验证机制(如 JWT、OAuth),会增加初始化时间。
    • 通常,这个步骤是最耗时的,特别是当目标服务延迟较高或网络不稳定时。
  • 优化建议

    1. 启用预热机制
      • 设置 minIdletimeBetweenEvictionRunsMillis,在负载高峰前预先创建连接。
    2. 优化网络环境
      • 使用快速 DNS 服务和低延迟网络。
    3. 连接复用
      • 尽量通过池化减少新连接的创建频率。

B. validateObject(验证对象)

  • 耗时原因

    • 验证逻辑可能会检查连接是否存活,通常包括:
      1. 检查连接是否已关闭或终止(通常较快)。
      2. 测试连接是否有效(如发送心跳或小数据包),如果涉及网络交互则可能增加延迟。
      3. 外部资源状态检查(例如,验证服务器响应状态)。
    • 如果验证逻辑涉及网络请求(如 Ping 服务器),会导致验证时间延长。
  • 优化建议

    1. 本地快速验证
      • 首选本地状态检查(如 !channel.isShutdown()),尽量避免网络交互。
    2. 设置合理的验证频率
      • 仅在必要时启用 testOnBorrowtestWhileIdle

C. activateObject(激活对象)

  • 耗时原因

    • 激活逻辑通常较快,但如果涉及复杂的状态初始化或外部资源调用,可能会增加耗时。
    • 示例耗时操作:
      • 加载上下文信息。
      • 注册监控事件。
      • 清理历史状态。
  • 优化建议

    1. 简化激活逻辑,尽量避免耗时操作。
    2. 将部分激活工作移至 makeObject,减少借用时的开销。

2. 哪些方法通常较快

A. passivateObject(钝化对象)

  • 用于在对象归还时重置状态,通常仅涉及本地操作,例如清除缓存或重置标志位,通常耗时极低。

B. destroyObject(销毁对象)

  • 销毁对象时通常调用 ManagedChannel.shutdown(),异步关闭连接,对借用方的延迟影响较小。

3. 可能耗时的场景与应对策略

场景耗时操作应对策略
创建新连接DNS 解析、网络连接、SSL 握手、身份验证启用预热机制,提前创建连接,减少高峰期负载压力
验证连接有效性网络交互(如心跳)、服务器状态检查优化验证逻辑,仅在必要时进行全面检查
激活对象(初始化)初始化上下文、注册事件、状态清理尽量简化激活逻辑,避免复杂耗时操作
网络不稳定或服务延迟问题依赖外部服务的操作会增加时间增强网络稳定性,确保服务响应快速可靠

4. 性能优化总结

  1. 减少创建连接频率

    • 通过连接池复用 GrpcChannel,减少 makeObject 的调用次数。
  2. 优化验证逻辑

    • validateObject 中优先使用本地检查,避免不必要的网络交互。
  3. 提前创建和预热连接

    • 设置 minIdletimeBetweenEvictionRunsMillis,在负载高峰前确保足够的空闲连接。
  4. 监控与调试

    • 记录各方法的执行时间,识别性能瓶颈并优化耗时操作。

通过以上优化,可以显著降低 borrowObject 方法的延迟,提高 GrpcChannelPool 的性能和可靠性。


makeObject(创建对象)耗时分析及优化

1. 影响 makeObject 耗时的主要因素

A. DNS 解析时间

  • 在创建 GrpcChannel 时,如果目标地址需要解析 DNS,耗时取决于 DNS 服务的响应时间。
  • 一般耗时
    • 通常在 10-50ms
    • 如果缓存了 DNS 解析结果,可以进一步减少时间。

B. 网络连接时间

  • 创建 GrpcChannel 需要与服务器建立 TCP 连接,这个过程受以下因素影响:
    1. 服务器响应速度
    2. 网络延迟(RTT,往返时间)。
  • 一般耗时
    • 本地网络环境(LAN):通常在 5-30ms
    • 跨区域(WAN):可能达到 50-150ms,视网络质量而定。

C. SSL/TLS 握手时间

  • 如果 GrpcChannel 使用了加密连接(useTransportSecurity),握手会增加额外的耗时,包括:
    1. 公私钥交换。
    2. 加密算法协商。
    3. 服务端证书验证。
  • 一般耗时
    • 通常在 50-200ms,具体取决于服务器和客户端的计算能力以及网络环境。

D. 自定义逻辑

  • 如果 makeObject 中包含其他初始化逻辑,例如身份认证、加载配置或依赖外部资源,可能进一步增加时间。
  • 一般耗时:不固定,完全取决于实现。

2. 实际测量方法

为了测量 makeObject 的平均耗时,可以在代码中记录开始和结束时间,例如:

代码示例
import java.time.Duration;
import java.time.Instant;
import org.apache.commons.pool2.impl.DefaultPooledObject;public class GrpcChannelFactory implements PooledObjectFactory<ManagedChannel> {private final String target;public GrpcChannelFactory(String target) {this.target = target;}@Overridepublic PooledObject<ManagedChannel> makeObject() {Instant start = Instant.now(); // 开始计时ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext() // 或者使用 .useTransportSecurity().build();Instant end = Instant.now(); // 结束计时System.out.println("makeObject 耗时: " + Duration.between(start, end).toMillis() + " ms");return new DefaultPooledObject<>(channel);}// 其他方法省略...
}

3. 平均耗时的估算

在不同场景下,makeObject 的平均耗时可能如下:

场景环境平均耗时主要原因
本地开发(无加密)本地服务器/LAN5-20msTCP 连接快速,且无额外开销。
生产环境(加密连接)云服务器/WAN50-150msSSL 握手和网络延迟导致耗时增加。
复杂认证或初始化逻辑使用外部身份认证服务200ms 或更高认证请求和外部依赖增加了耗时。

4. 如何优化 makeObject 的耗时

A. 减少 DNS 解析时间

  • 方法
    1. 在客户端启用 DNS 缓存(Java 默认启用,缓存时间可配置)。
    2. 使用 IP 地址直连,跳过 DNS 解析。

B. 提高网络连接速度

  • 方法
    1. 部署 gRPC 服务器和客户端在同一网络区域,降低网络延迟。
    2. 使用快速网络,如低延迟的专用通道或优化路由。

C. 减少 SSL 握手时间

  • 方法
    1. 使用更高效的加密算法(如 TLS 1.3)。
    2. 启用会话复用(Session Resumption),避免每次都重新握手。

D. 简化初始化逻辑

  • 方法
    1. 尽量减少 makeObject 中的额外逻辑,将复杂任务移到其他阶段。
    2. 在对象池中预热连接,减少实际使用时的初始化开销。

5. 总结

  • 本地开发环境:平均耗时 5-20ms
  • 生产环境(加密连接、跨区域):平均耗时 50-150ms,高延迟网络可能更高。
  • 复杂认证场景:如果涉及外部依赖,可能超过 200ms

通过优化网络环境、减少初始化逻辑和启用预热机制,可以有效降低 makeObject 的平均耗时,从而提高系统性能。


makeObject(创建对象)与等待线程数的耗时比较

1. 两者耗时的核心区别

A. makeObject(创建对象)耗时

makeObject 的耗时是主动操作的结果,受以下因素影响:

  1. 创建过程中的外部依赖
    • DNS 解析、网络连接、SSL/TLS 握手、外部服务验证等。
    • 这些操作通常是固定的,对于每个新对象的创建,耗时是线性增加的。
  2. 无法完全避免
    • 如果连接池中没有足够的空闲对象,且活跃对象数已接近 maxTotalmakeObject 是必需的耗时操作。

典型耗时范围

  • 无加密/本地连接:5-30ms。
  • 加密连接/复杂验证:50-200ms,甚至更高。

B. 等待执行的线程数

等待线程数的耗时是被动等待的结果,受以下因素影响:

  1. 线程排队机制
    • borrowObject 被调用时,如果没有空闲对象且活跃对象数已达 maxTotal,新的线程会进入等待状态。
  2. 最大等待时间限制
    • 配置了 maxWaitMillis 时,线程会阻塞至超时或有对象归还/创建完成。
  3. 竞争关系
    • 如果线程数较多,等待时间可能呈指数级增长,因为所有线程需要依次获取锁或等待资源。

典型耗时范围

  • 低竞争场景:几十毫秒到几百毫秒,取决于资源释放速度。
  • 高竞争场景:可能超时(抛出 NoSuchElementExceptionTimeoutException),视配置而定。

2. 哪种操作更耗时?

场景 1:连接池有足够的资源

  • makeObject 更耗时
    • 如果连接池中有空闲对象,即使有线程排队,借用操作会立即完成,线程等待耗时较短。
    • 新对象的创建仍需要进行网络连接等耗时操作,因此 makeObject 更耗时。

场景 2:连接池资源耗尽

  • 等待线程数更耗时
    • 当所有对象都被借出,且线程需要等待时,线程排队时间可能无限增长(取决于资源归还速度)。
    • 特别是高并发场景中,线程数较多时,每个线程的等待时间会显著增加。

场景 3:高并发 + 对象创建较慢

  • 两者均耗时
    • 在高并发场景中,如果 makeObject 创建对象较慢,线程等待时间会与 makeObject 的耗时叠加。
    • 如果等待线程数远多于可用资源,线程的等待时间可能最终成为主要瓶颈。

3. 优化策略

A. 优化 makeObject 的耗时

  1. 启用预热机制
    • 配置 minIdletimeBetweenEvictionRunsMillis,确保在高并发到来前提前创建连接。
  2. 简化创建逻辑
    • 优化 DNS 解析、网络连接和认证流程,减少创建对象的固定开销。
  3. 分布式连接池
    • 在高并发场景下,使用多个连接池分散负载,降低单个池的压力。

B. 优化等待线程数

  1. 增加连接池容量
    • 调整 maxTotalmaxIdle,确保池中有足够的资源处理高峰流量。
  2. 动态调配资源
    • 根据请求量动态调整池的大小,避免长时间的线程排队。
  3. 合理设置超时
    • 配置 maxWaitMillis,限制线程的最大等待时间,避免因过长的阻塞导致系统雪崩。

4. 综合判断:耗时比较

条件耗时较高的操作原因
空闲连接充足makeObject需要进行创建过程,涉及网络连接、加密握手等。
资源完全耗尽等待线程数线程阻塞时间可能超过资源创建时间,取决于资源归还速度和线程数。
高并发 + 低资源归还速率两者均耗时新对象创建缓慢导致线程长时间排队,线程排队又进一步增加系统压力。

5. 示例优化配置

以下是一个优化配置的示例,平衡 makeObject 和等待线程数的耗时问题:

GenericObjectPoolConfig<ManagedChannel> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(50);                      // 增加池的容量,减少线程等待
config.setMinIdle(10);                       // 启用预热机制,提前创建连接
config.setTimeBetweenEvictionRunsMillis(10000); // 每 10 秒检测空闲连接
config.setMaxWaitMillis(500);                // 限制线程的最大等待时间
config.setTestOnBorrow(true);                // 借用时验证连接是否有效

6. 结论

  • 小规模并发(空闲资源充足)makeObject 通常更耗时。
  • 高并发 + 资源耗尽:线程等待时间更耗时。
  • 综合优化:通过预热机制、动态资源调配和合理配置参数,可以有效降低两者的耗时,提升系统性能。

相关文章:

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

在调用 borrowObject 方法时&#xff0c;Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接&#xff0c;支持多路复用&#xff0c;即通过单个通道可以发送多…...

Linux中的tty和pts概念和区别

目录 1、什么是tty &#xff08;1&#xff09;tty的概念 &#xff08;2&#xff09;tty0 &#xff08;3&#xff09;tty1~6 2、什么是pts &#xff08;1&#xff09;pts的含义 &#xff08;2&#xff09;pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...

【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】

Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异&#xff0c; 在 SoC设计中&#xff0c;RTL-to-Netlist映射 是从RTL&#xff08;Register Transfer Level&#xff09;代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...

机器学习经典算法——线性回归

目录 算法介绍 一元线性回归模型 多元线性回归模型 ​误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种…...

MLU上使用MagicMind GFPGANv1.4 onnx加速!

文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架&#xff08;TensorFlow、PyTorch、Caffe与ONNX等&#xff09;训练好…...

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…...

【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图

Flink CDC版本&#xff1a;3.2.1 说明&#xff1a;本文从SchemaOperator接收到&#xff0c;表结构变更事件开始&#xff0c;表结构变更事件应由source端产生&#xff0c;本文不讨论。 可以先看流程图&#xff0c;研究源码。 参考文章&#xff1a; Flink cdc3.0动态变更表结构—…...

【智能算法】改进蚁狮优化算法【matlab】

目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连续性边界…...

swagger导出json

要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...

Go语言的 的引用数据类型(Reference Data Types)核心知识

Go语言的引用数据类型&#xff08;Reference Data Types&#xff09;核心知识 引言 Go语言作为一种现代编程语言&#xff0c;因其简洁的语法、强大的并发支持以及丰富的标准库而受到广泛欢迎。在Go语言中&#xff0c;数据类型可以分为值类型和引用类型。本文将深入探讨Go语言…...

JAVA解析Excel复杂表头

废话不多说&#xff0c;直接上源码。前后端都有哦&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e; 能帮到你记得点赞收藏哦&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#…...

jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例

1. 各个组件如何新建的&#xff1f; 2. "http请求" 组件内容样例&#xff1a; "消息体数据" 源码&#xff1a; {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…...

我的创作纪念日——《惊变128天》

我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝&#xff0c;转眼间&#xff0c;我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日&#xff0c;我满怀忐忑与期待&#xff0c;撰写了第一篇技术博客《讲解LeetCode第1题&#xff1a;两数之和…...

vuedraggable 选项介绍

vuedraggable 是基于 SortableJS 的 Vue 组件&#xff0c;提供了丰富的选项来定制拖拽行为。以下是 vuedraggable 常用的选项和它们的详细说明&#xff1a; 常用选项介绍 group 配置拖拽分组。多个列表可以共享同一个分组&#xff0c;允许它们之间的项目互相拖拽。 group: { na…...

微信小程序获取后端数据

在小程序中获取后端接口数据 通常可以使用 wx.request 方法&#xff0c;以下是一个基本示例&#xff1a; // pages/index/index.js Page({data: {// 用于存储后端返回的数据resultData: [] },onLoad() {this.fetchData();},fetchData() {wx.request({url: https://your-backe…...

ThreadLocal` 的工作原理

ThreadLocal 的工作原理&#xff1a; ThreadLocal 是 Java 提供的一个类&#xff0c;它用于为每个线程提供独立的变量副本。也就是说&#xff0c;多个线程访问同一个 ThreadLocal 变量时&#xff0c;每个线程看到的值都是不同的&#xff0c;相互隔离&#xff0c;互不干扰。 T…...

数据挖掘教学指南:从基础到应用

数据挖掘教学指南&#xff1a;从基础到应用 引言 数据挖掘是大数据时代的核心技术之一&#xff0c;它从大量数据中提取有用信息和知识。本教学文章旨在为学生和初学者提供一个全面的数据挖掘学习指南&#xff0c;涵盖数据挖掘的基本概念、流程、常用技术、工具以及教学建议。…...

大模型搜索引擎增强问答demo-纯python实现

流程概览 本文使用python语言,实现了大模型搜索引擎增强问答demo。 大模型搜索引擎增强问答定义:根据问题搜索得到相关内容,拼接prompt=问题+搜索结果,将这个prompt传入大模型,得到最终的结果。 优势在于搜索引擎可以返回实时性信息,例如明日双色球开奖信息、最新八卦…...

【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 编程要求 相关知识 1. 选择结构 2. 主要语句类型 3. 比较操作 4. 交换操作 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;从键盘上输入三个数&#xff0c;请按从小到大的顺序排序并打印输出排序后的结果。 编程要求 根据提示…...

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch&#xff0c;通过vscode集成环境开发pytorch 下载 anaconda 下载网址&#xff0c;选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…...

DDPM优化目标公式推导

DDPM优化目标公式推导 DDPM优化目标公式推导**1. 问题定义****2. 优化目标&#xff1a;最大化对数似然****3. 变分下界的分解****4. 关键步骤&#xff1a;简化 KL 散度项****(a) 后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) q(xt…...

多模态大语言模型arxiv论文略读(109)

Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文标题&#xff1a;Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文作者&#xff1a;Wenwen Zhuang, Xin Huang, Xiantao Z…...

性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断

&#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 &#x1f4da; 目录 &#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler&#xff1f; &#x1f9d0;二、集成 MiniProf…...

CCPC chongqing 2025 H

题目链接&#xff1a;https://codeforces.com/gym/105887 题目背景&#xff1a; 方框上有上下两排小球&#xff0c;下面的紧贴框底&#xff0c;上面的部分贴框顶&#xff0c;每牌小球上都有一个一个数字(1~n)&#xff0c;将相同的小球连接到一起&#xff0c;是否在不交叉的情况…...

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…...

微软推出SQL Server 2025技术预览版,深化人工智能应用集成

在Build 2025 大会上&#xff0c;微软向开发者社区开放了SQL Server 2025的测试版本。该版本的技术改进主要涵盖人工智能功能集成、系统性能优化与开发工具链升级三个维度&#xff0c;展示了数据库管理系统在智能化演进方向上的重要进展。 智能数据处理功能更新 新版本的技术亮…...

Dynamics 365 Finance + Power Automate 自动化凭证审核

&#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核 &#x1f4d1; 目录 &#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核1. 依赖 &#x1f527;2. 目标 &#x1f3af;3. 系统架构 &#x1f3d7;️4. 凭证审批全流程 &#x1f6e0;️4.1 …...

Harmony核心:动态方法修补与.NET游戏Mod开发

一、Harmony的核心定位与设计哲学 Harmony是一个运行时动态方法修补库&#xff0c;专为修改已编译的.NET/Mono应用程序而设计&#xff0c;尤其适用于游戏Mod开发。其核心创新在于&#xff1a; 非破坏性修改&#xff1a;保留原始方法完整性&#xff0c;避免直接替换或覆盖。多…...

固定ip和非固定ip的区别是什么?如何固定ip地址

在互联网中&#xff0c;我们常会接触到固定IP和非固定IP的概念。它们究竟有何不同&#xff1f;如何固定IP地址&#xff1f;让我们一起来探究这个问题。 一、固定IP和非固定IP的区别是什么 固定IP&#xff08;静态IP&#xff09;和非固定IP&#xff08;动态IP&#xff09;是两种…...

tensorflow image_dataset_from_directory 训练数据集构建

以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求&#xff1a; 主目录下包含多个子目录&#xff0c;每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…...