并发设计模式实战系列(3):工作队列
🌟 大家好,我是摘星! 🌟
今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue),废话不多说直接开始~
目录
一、核心原理深度拆解
1. 生产者-消费者架构
2. 核心组件
二、生活化类比:餐厅厨房系统
三、Java代码实现(生产级Demo)
1. 完整可运行代码
2. 关键配置解析
四、横向对比表格
1. 多线程模式对比
2. 队列实现对比
五、高级优化技巧
1. 动态线程池调整
2. 优先级任务处理
3. 监控指标埋点
六、扩展设计模式集成
1. 责任链+工作队列(复杂任务处理)
七、高级错误处理机制
1. 重试策略设计
2. 代码实现(带重试的Worker)
八、分布式工作队列扩展
1. 基于Kafka的分布式架构
2. 关键配置参数
九、性能调优实战指南
1. 性能瓶颈定位四步法
2. JVM优化参数建议
十、行业应用案例解析
1. 电商秒杀系统实现
2. 日志处理流水线
十一、虚拟线程(Loom)前瞻
1. 新一代线程模型对比
2. 虚拟线程工作队列示例
十二、设计模式决策树
一、核心原理深度拆解
1. 生产者-消费者架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Producers │───> │ Work Queue │───> │ Consumers │
│ (多线程生成) │<─── │ (任务缓冲) │<─── │ (线程池处理) │
└─────────────┘ └─────────────┘ └─────────────┘
- 解耦设计:分离任务创建(生产者)与任务执行(消费者)
- 流量削峰:队列缓冲突发流量,防止系统过载
- 资源控制:通过线程池限制最大并发处理数
2. 核心组件
- BlockingQueue:线程安全的任务容器(支持put/take阻塞操作)
- ThreadPool:可配置核心/最大线程数,保持CPU利用率与响应速度平衡
- 任务拒绝策略:定义队列满时的处理方式(丢弃/抛异常/生产者处理)
二、生活化类比:餐厅厨房系统
系统组件 | 现实类比 | 核心机制 |
生产者 | 服务员接收顾客点单 | 快速记录订单,不参与烹饪 |
工作队列 | 悬挂式订单传送带 | 暂存待处理订单,平衡前后台节奏 |
消费者 | 厨师团队 | 按订单顺序并行烹饪 |
- 高峰期应对:10个服务员接收订单 → 传送带缓冲50单 → 5个厨师并行处理
三、Java代码实现(生产级Demo)
1. 完整可运行代码
import java.util.concurrent.*;public class WorkQueuePattern {// 任务队列(建议根据内存设置合理容量)private final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);// 线程池配置private final ExecutorService workerPool = new ThreadPoolExecutor(4, // 核心厨师数8, // 最大厨师数(应对高峰期)30, TimeUnit.SECONDS, // 闲置线程存活时间new LinkedBlockingQueue<>(20), // 线程池等待队列new ThreadFactory() { // 定制线程命名private int count = 0;@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "worker-" + count++);}},new ThreadPoolExecutor.AbortPolicy() // 队列满时拒绝任务);// 生产者模拟class OrderProducer implements Runnable {@Overridepublic void run() {int orderNum = 0;while (!Thread.currentThread().isInterrupted()) {try {Runnable task = () -> {System.out.println("处理订单: " + Thread.currentThread().getName());// 模拟处理耗时try { Thread.sleep(500); } catch (InterruptedException e) {}};workQueue.put(task); // 阻塞式提交System.out.println("生成订单: " + (++orderNum));Thread.sleep(200); // 模拟下单间隔} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}// 启动系统public void start() {// 启动2个生产者线程new Thread(new OrderProducer(), "producer-1").start();new Thread(new OrderProducer(), "producer-2").start();// 消费者自动从队列取任务new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {try {Runnable task = workQueue.take();workerPool.execute(task);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}).start();}public static void main(String[] args) {WorkQueuePattern kitchen = new WorkQueuePattern();kitchen.start();// 模拟运行后关闭try { Thread.sleep(5000); } catch (InterruptedException e) {}kitchen.shutdown();}// 优雅关闭public void shutdown() {workerPool.shutdown();try {if (!workerPool.awaitTermination(3, TimeUnit.SECONDS)) {workerPool.shutdownNow();}} catch (InterruptedException e) {workerPool.shutdownNow();}}
}
2. 关键配置解析
// 线程池参数调优公式(参考)
最佳线程数 = CPU核心数 * (1 + 平均等待时间/平均计算时间)// 四种拒绝策略对比:
- AbortPolicy:直接抛出RejectedExecutionException(默认)
- CallerRunsPolicy:由提交任务的线程自己执行
- DiscardPolicy:静默丢弃新任务
- DiscardOldestPolicy:丢弃队列最旧任务
四、横向对比表格
1. 多线程模式对比
模式 | 任务调度方式 | 资源管理 | 适用场景 |
Work Queue | 集中队列分配 | 精确控制线程数 | 通用任务处理 |
Thread-Per-Task | 直接创建线程 | 容易资源耗尽 | 简单低并发场景 |
ForkJoin Pool | 工作窃取算法 | 自动负载均衡 | 计算密集型任务 |
Event Loop | 单线程事件循环 | 极低资源消耗 | IO密集型任务 |
2. 队列实现对比
队列类型 | 排序方式 | 阻塞特性 | 适用场景 |
LinkedBlockingQueue | FIFO | 可选有界/无界 | 通用任务排队 |
PriorityBlockingQueue | 自定义优先级 | 无界队列 | 紧急任务优先处理 |
SynchronousQueue | 无缓冲 | 直接传递 | 实时任务处理 |
DelayQueue | 延迟时间 | 时间触发 | 定时任务调度 |
五、高级优化技巧
1. 动态线程池调整
// 根据队列负载动态扩容
if (workQueue.size() > threshold) {ThreadPoolExecutor pool = (ThreadPoolExecutor) workerPool;pool.setMaximumPoolSize(newMaxSize);
}
2. 优先级任务处理
// 使用PriorityBlockingQueue需实现Comparable
class PriorityTask implements Runnable, Comparable<PriorityTask> {private int priority;@Overridepublic int compareTo(PriorityTask other) {return Integer.compare(other.priority, this.priority);}// run()方法实现...
}
3. 监控指标埋点
// 监控队列深度
Metrics.gauge("workqueue.size", workQueue::size);// 线程池监控
ThreadPoolExecutor pool = (ThreadPoolExecutor) workerPool;
Metrics.gauge("pool.active.threads", pool::getActiveCount);
Metrics.gauge("pool.queue.size", () -> pool.getQueue().size());
六、扩展设计模式集成
1. 责任链+工作队列(复杂任务处理)
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Task │ │ Task │ │ Task │
│ Splitter │───> │ Processor │───> │ Aggregator│
└───────────┘ └───────────┘ └───────────┘↓ ↓ ↓[拆分子任务] [并行处理] [结果合并]
- 场景:电商订单处理(拆分子订单→并行校验→合并结果)
- 代码片段:
// 任务拆分器
class OrderSplitter {List<SubOrder> split(MainOrder order) { /* 拆分为N个子订单 */ }
}// 子任务处理器
class OrderValidator implements Runnable {public void run() { /* 库存校验/地址校验等 */ }
}// 结果聚合器
class ResultAggregator {void aggregate(List<SubResult> results) { /* 合并校验结果 */ }
}
七、高级错误处理机制
1. 重试策略设计
策略类型 | 实现方式 | 适用场景 |
立即重试 | 失败后立即重试最多3次 | 网络抖动等临时性问题 |
指数退避 | 等待时间=2^n秒(n为失败次数) | 服务过载类错误 |
死信队列 | 记录失败任务供人工处理 | 数据错误等需干预问题 |
2. 代码实现(带重试的Worker)
class RetryWorker implements Runnable {private final Runnable task;private int retries = 0;public RetryWorker(Runnable task) {this.task = task;}@Overridepublic void run() {try {task.run();} catch (Exception e) {if (retries++ < MAX_RETRY) {long delay = (long) Math.pow(2, retries);executor.schedule(this, delay, TimeUnit.SECONDS);} else {deadLetterQueue.put(task);}}}
}
八、分布式工作队列扩展
1. 基于Kafka的分布式架构
┌────────────┐│ Kafka ││ (Partition)│└─────┬──────┘│
┌───────────┐ ┌───┴────┐ ┌───────────┐
│ Producer ├───orders───> │ │ ──workers─> │ Consumer │
│ Service │ │ Topic │ │ Group │
└───────────┘ └─────────┘ └───────────┘
- 特性:
-
- 分区机制实现并行处理
- 消费者组自动负载均衡
- 持久化保证不丢消息
2. 关键配置参数
# 生产者端
acks=all # 确保消息持久化
retries=10 # 发送失败重试次数
max.in.flight=5 # 最大未确认请求数# 消费者端
enable.auto.commit=false # 手动提交offset
max.poll.records=100 # 单次拉取最大记录数
session.timeout.ms=30000 # 心跳检测时间
九、性能调优实战指南
1. 性能瓶颈定位四步法
- 监控队列深度:
workQueue.size() > 阈值
时报警 - 分析线程状态:
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
for (long tid : bean.getAllThreadIds()) {System.out.println(bean.getThreadInfo(tid));
}
- JVM资源检查:
jstat -gcutil <pid> 1000 # GC情况
jstack <pid> # 线程dump
- 压测工具验证:
ab -n 10000 -c 500 http://api/endpoint
2. JVM优化参数建议
-XX:+UseG1GC # G1垃圾回收器
-XX:MaxGCPauseMillis=200 # 目标暂停时间
-Xms4g -Xmx4g # 固定堆大小
-XX:MetaspaceSize=256m # 元空间初始值
-XX:+ParallelRefProcEnabled # 并行处理引用
十、行业应用案例解析
1. 电商秒杀系统实现
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 请求入口 │ │ 库存预扣 │ │ 订单生成 │
│ (Nginx限流) │───> │ (Redis队列) │───> │ (DB批量写入) │
└───────────────┘ └───────────────┘ └───────────────┘
- 关键设计:
-
- 使用Redis List作为分布式队列
- 库存预扣与订单生成解耦
- 数据库批量写入合并操作
2. 日志处理流水线
// 使用Disruptor高性能队列
class LogEventProcessor {void onEvent(LogEvent event, long sequence, boolean endOfBatch) {// 1. 格式清洗// 2. 敏感信息过滤// 3. 批量写入ES}
}
- 性能对比:
-
- 传统队列:10万条/秒
- Disruptor:2000万条/秒
十一、虚拟线程(Loom)前瞻
1. 新一代线程模型对比
维度 | 平台线程 | 虚拟线程 |
内存消耗 | 1MB/线程 | 1KB/线程 |
切换成本 | 涉及内核调度 | 用户态轻量级切换 |
适用场景 | CPU密集型任务 | IO密集型高并发场景 |
2. 虚拟线程工作队列示例
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();void handleRequest(Request request) {executor.submit(() -> {try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> user = scope.fork(() -> queryUser(request));Future<String> order = scope.fork(() -> queryOrder(request));scope.join();return new Response(user.get(), order.get());}});
}
十二、设计模式决策树
graph TDA[任务类型?] --> B{CPU密集型}A --> C{IO密集型}B --> D[线程数=CPU核心数+1]C --> E[线程数=CPU核心数*2]E --> F{是否需资源隔离?}F --> |是| G[使用多个独立线程池]F --> |否| H[共享线程池+队列]H --> I{是否需优先级?}I --> |是| J[PriorityBlockingQueue]I --> |否| K[LinkedBlockingQueue]
相关文章:
并发设计模式实战系列(3):工作队列
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet 问题解决: 用爱思助手连接手机,点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧࿰…...
用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday
1、背景与动机 只要你的服务接收并回显用户生成内容(UGC)——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS(Cross‑Site Scripting)攻击风险。浏览器在解析 HTML 时会执行脚本;如果不做清理&#…...
MySQL基本查询与数据操作全面解析
目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询(慎用) 指定列查询 表达式查询 结果去重 3.2 条件查询(WHERE子句&#…...
《C++ 模板:泛型编程的核心》
C模板详解 模板是C中实现泛型编程的重要特性,它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...
Web3实战:从零开发你的ERC20代币合约
区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈,手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币,并部署到以太坊Sepolia测试网。以下是完整开发路线图: 一、ERC20代币的…...
简述大疆无人机对接
文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言,对接大疆的…...
docker-compose搭建kafka
1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...
FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载
FramePack 是斯坦福大学主导开发的视频生成框架,是一种用于视频生成的下一帧(下一帧部分)预测神经网络结构,可以逐步生成视频。FramePack 主要开发者之一,就是业内大名鼎鼎的张吕敏大佬,AI领域的“赛博佛祖…...
开发网页程序时预览时遇到跨域问题解决方法
CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...
【音视频】FFmpeg内存模型
FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候,有两种情况: 两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题;两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存…...
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式,在Web服务和应用程序中广泛使用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读…...
在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用
在视频处理的众多需求中,将视频转换为 AVI 格式是不少用户的刚需。小白工具网(https://www.xiaobaitool.net/videos/convert-to-avi/ )的在线视频转 AVI 功能,以其显著优势,多格式支持、便捷操作、数据安全保障以及广泛…...
【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础
引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...
L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制
一、为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在: 固定输出格式&am…...
Java集成Zxing和OpenCV实现二维码生成与识别工具类
Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库,实现二维码的生成和识别功能。识别方法支持多种输入形式,包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...
jenkins pipeline ssh协议报错处理
一、jenkins版本 jenkins:2.492.3 openssh:OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1:手动添加目标主机密钥到Jenk…...
当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?
在数字化的世界里,OCR(光学字符识别)技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型,一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下,当你拿着模糊的财务报表扫描件时ÿ…...
vue watch监听路由,第一次进入不触发解决办法
“第一次进入的时候没触发,第二次就触发了”非常典型,它印证了路由监听(无论是 watch $route 还是 beforeRouteUpdate)主要是为了监听变化,而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...
JVM考古现场(二十四):逆熵者·时间晶体的永恒之战
"警告!时间晶体正在吞噬GC日志!" 我腰间的太极八卦镜突然迸发出刺目的量子辉光,终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖! 楔子:时间晶体的觉醒 🕯️…...
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
spring中使用netty-socketio部署到服务器(SSL、nginx转发) 本文实现前端socket.io-client连接后端netty-socketio,并且部署到服务器上的示例,以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...
qt.tlsbackend.ossl: Failed to load libssl/libcrypto.
我的环境是windows,QT6.3.2(msvc2019_64/mingw_64) 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意,是其他方式安装过openssl,环境变量有,但是QT找不到的问题。…...
【Python爬虫基础篇】--3.cookie和session
目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。 例子࿱…...
uView的u-modal不显示问题
问题分析:在项目中,其他页面显示正常,在这个页面显示不正常。 问题解决: 一般的原因,诸如层级遮挡控制器true后,被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...
联易融科技:以科技赋能驱动经营反转与价值重估
行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示,截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...
Office文档图片批量提取工具
Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具,支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 343KB,无需安装即可运行,通过拖拽操作实现快速解析与导出,尤其适合需批量…...
Python 设计模式:回调模式
1. 什么是回调函数? 回调函数是指作为参数传递给另一个函数的函数。当这个函数执行到某个特定的点时,它会调用这个回调函数。回调函数通常用于处理异步操作、事件处理或在某些条件下执行特定的操作。 回调函数的特点: 作为参数传递&#x…...
DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册
一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…...
大数据学习(112)-HIVE中的窗口函数
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Hive学习
一、Hive 核心原理 1. Hive 架构与执行流程 Hive 是基于 Hadoop 的数据仓库工具,将 SQL 转化为分布式计算任务(MapReduce/Tez/Spark),核心组件如下: 元数据存储(Metastore):存储表…...
前端开发核心知识详解:Vue2、JavaScript 与 CSS
一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持,为每个属性定义getter和setter。getter用于收集依赖,当视图中使用到该属性时…...
仅追加KV数据库
仅追加KV数据库 6.1 我们将要做什么 在本章中,我们将创建一个基于文件的键值存储(KV Store),其核心是一个写时复制(Copy-on-Write, CoW)B 树。这种设计的目标是实现数据的持久性和原子性。 1. 设计概述 …...
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
在Java中,Vector、ArrayList和LinkedList均实现了List接口,但它们在线程安全、数据结构、性能特性及应用场景上存在显著差异。 1. Vector、ArrayList 和 LinkedList 的区别 Vector: 线程安全:Vector 是线程安全的动态数组&#…...
Git分支管理方案
成都众望智慧有限公司Git分支管理方案 采用 轻量级Git Flow 敏捷版本控制策略,在保证稳定性的同时提升开发效率。以下是优化后的方案: 1. 精简分支模型(相比6-8人团队减少分支层级) 分支类型作用生命周期devops生产环境代码&am…...
SQL Tuning Advisor
什么是SQL Tuning Advisor STA可以用来优化那些已经被发现的高负载SQL. 默认情况下, Oracle数据库在自动维护窗口中自动认证那些有问题的SQL并且执行优化建议,找寻提升高负载SQL执行计划性能的方法. ** 如何查看自动优化维护窗口产生的报告? ** SQL> set ser…...
联易融出席深圳链主企业供应链金融座谈会,加速对接票交所系统
近日,深圳市委金融办组织召开全市链主企业供应链金融高质量发展座谈会。联易融作为供应链金融企业代表,与虾皮信息科技、电子元器件和集成电路国际交易中心等代表性机构以及行业协会、金融机构参加了会议。 发展供应链金融是破解中小微企业融资难、融资…...
【前端记事】关于electron的入门使用
electron入门使用 背景how to start第一步 创建一个vite-vue3项目第二步 装各种依赖第三步 配置vite.config.jspackage.jsonelectron入口 启动重写关闭、隐藏、最大化最小化 背景 最近对electron比较感兴趣,折腾一段时间后有了点眉目,记录一下 how to …...
Qt绘制可选择范围的日历
【日历控件设计】 #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QCalendarWidget> #include <QHBoxLayout> #include <QSpinBox> #include <QPushButton> #include <QLabel> #include <Q…...
Pycharm(十五)面向对象程序设计基础
目录 一、定义类及使用类的成员 二、self关键字介绍 三、在类内部调用类中的函数 class 类名: 属性(类似于定义变量) 行为(类似于定义函数,只不过第一个形参要写self) 一、面向对象基本概述 属性&…...
【C++游戏引擎开发】第21篇:基于物理渲染(PBR)——统计学解构材质与光影
引言 宏观现象:人眼观察到的材质表面特性(如金属的高光锐利、石膏的漫反射柔和),本质上是微观结构对光线的统计平均结果。 微观真相:任何看似平整的表面在放大后都呈现崎岖的微观几何。每个微表面(Microfacet)均为完美镜面,但大量微表面以不同朝向分布时,宏观上会表…...
flutter_slidable 插件使用
简介 flutter_slidable 是一个用于创建可滑动列表项的 Flutter 插件,它允许用户通过滑动来显示隐藏的操作按钮,比如删除、分享等功能。 安装 在 pubspec.yaml 中添加依赖(并运行 flutter pub get): dependencies:fl…...
[论文阅读]ConfusedPilot: Confused Deputy Risks in RAG-based LLMs
ConfusedPilot: Confused Deputy Risks in RAG-based LLMs [2408.04870] ConfusedPilot: Confused Deputy Risks in RAG-based LLMs DEFCON AI Village 2024 文章是针对Copilot这样一个RAG服务提供平台的攻击 在企业环境中整合人工智能工具(如 RAG)会…...
诠视科技MR眼镜如何使用头瞄点和UGUI交互
诠视科技MR眼镜如何使用头瞄点和UGUI交互 要实现头瞄点计算单元确认键操作UGUI,最快捷的方式,右键直接添加XvHeadGazeInputController。 添加以后会自动生成XvHeadGazeInputController到Head节点下面去。 重要的几个参数讲解: scaleFactor:…...
数据赋能(204)——原则与原理——原理方法
原理更多地关注事物本身的客观规律,而原则侧重于指导人们的行为和决策。原则与原理是两个常常被提及,但有所区别的概念。原则和原理在各个领域中都发挥着重要的作用。 原理概念 原理,则通常指的是自然科学和社会科学中具有普遍意义的基本规…...
代码随想录算法训练营第五十六天 | 108.冗余连接 109.冗余连接II
108.冗余连接 题目链接:108. 冗余的边 文章讲解:代码随想录 思路: 题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树,如果有多个答案,则返回二维数组中最后出现的边。 …...
Git入门
一、Git 基础概念 1. 版本控制系统分类 本地版本控制:如RCS,仅在本机保存历史版本集中式版本控制:如SVN,单一中央服务器管理代码分布式版本控制:如Git,每个开发者都有完整的仓库副本 2. Git 核心概念 概…...
5G + 物联网:智能世界的催化剂,如何用Python打造下一代IoT应用?
5G 物联网:智能世界的催化剂,如何用Python打造下一代IoT应用? 在数字化时代,物联网(IoT) 已成为智能产业的关键技术。从智能家居到智慧城市,再到工业4.0,我们的世界正在变得越来越…...
从单点突破到链式攻击:XSS 的渗透全路径解析
在网络安全领域,跨站脚本攻击(Cross-Site Scripting,简称 XSS)早已不是新鲜话题。然而,随着网络技术的迭代与应用场景的复杂化,攻击者不再满足于单一的 XSS 漏洞利用,而是将 XSS 与其他安全漏洞…...
spark和hadoop的对比和联系
一、Apache Hadoop 简介 Hadoop是一个由Apache基金会开发的开源分布式计算平台。它主要由Hadoop分布式文件系统(HDFS)和MapReduce计算框架组成。HDFS是为大规模数据存储而设计的,它将文件分割成多个数据块(block)&…...
【Vue3 / TypeScript】 项目兼容低版本浏览器的全面指南
在当今前端开发领域,Vue3 和 TypeScript 已成为主流技术栈。然而,随着 JavaScript 语言的快速演进,许多现代特性在低版本浏览器中无法运行。本文将详细介绍如何使 Vue3 TypeScript 项目完美兼容 IE11 等低版本浏览器。 一、理解兼容性挑战 …...