【PGCCC】PostgreSQL 中表级锁的剖析
本博客解释了 PostgreSQL 中的锁定机制,重点关注数据定义语言 (DDL) 操作所需的表级锁定。
锁定还是解锁的艺术?
人们通常将数据库锁与物理锁进行比较,这甚至可能导致您订购有关锁的历史、波斯锁和撬锁技术的书籍。我们大多数人可能都是通过深入研究“锁定”一词来理解 PostgreSQL 中与物理锁没有太大关系的概念,物理锁主要与安全性有关。然而,Postgres 锁完全是关于并发性的,以及控制哪个事务可以持有锁,而另一个事务可以执行其操作,理想情况下不会相互阻塞。但正如我们所知,没有一个世界是完美的,无论是门锁还是AccessShareLock…
但是,既然我已经买了那些关于锁的书,我想我应该可以对开锁艺术和数据库锁定机制进行一些比较。首先我要说的是:要想撬开锁,不管是哪种锁,你都需要深入了解它的内部工作原理;销钉、弹子和机制是如何相互作用的。通过操纵它们,你可以找到正确的位置来解锁门或保险箱,而无需钥匙!同样,要想管理数据库锁,你需要了解数据库的内部工作原理,主要是 Postgres 中的并发工作原理。
MVCC 简介
PostgreSQL 使用多版本并发控制 (MVCC)来避免传统上与数据库相关的许多锁定问题。MVCC 的工作原理如下:
- 写入数据的新副本而不是修改行。
- 确保读取不会阻塞写入,并且写入不会阻塞读取。
当事务更新数据时,Postgres 会创建行的新版本,同时保留旧版本。每个行版本都包含用户不可见但对 MVCC 至关重要的系统列:
- xmin:创建此版本的交易 ID
- xmax:删除/更新此版本的事务ID(如果当前版本则为空)
- cmin, cmax:事务内的命令 ID
- ctid:行版本的物理位置
使用默认的读已提交隔离级别,每次开始执行语句时,Postgres 都会创建一个快照,其中包含: - 当前所有活跃交易ID
- 最新提交的事务ID
- 正在进行的交易列表
让我们看看它在“读已提交”隔离级别下的实际工作原理:
MVCC 示例
总而言之,存在一行,其中 Alice 的薪水为 50000。第一个事务 ( txid:100) 启动并获取其语句的快照SELECT,并看到 Alice 的薪水为 50000,因为该行的薪水xmax为空(意味着它是当前的),该行的薪水xmin(99)小于我们的事务 ID(100)并且事务99已经提交。
第二个事务(txid:101)将工资更新为 60000。这将创建两个行版本;旧版本标记为xmax=101,新版本标记为xmin=101。然后第二个事务提交,使其更改对任何新快照都可见。
当第一个事务执行其第二条SELECT语句时(在事务 2 提交之前),它仍然看到薪水 50000,因为事务101尚未提交。在事务 2 提交之后,当事务 1 执行其第三条SELECT语句时,它会获得一个新快照(读取已提交行为),现在看到薪水 60000,因为:
- 每个语句都会获得一个新的快照
- 交易101现已提交
- 行版本为xmin=101当前版本(xmax为空)
- 旧版本xmax=101在新快照中不再可见
此行为特定于“读已提交”隔离级别,其中每个语句都会获得一个新的快照,并且可以看到来自其他事务的已提交的更改,即使在同一个事务中也是如此。
但是,当然,MVCC 方法也有一些含义:
- 死行版本会不断累积,直到被VACUUM
- 由于保留多个版本,数据库大小可能会暂时增大
- 定期VACUUM维护对于性能至关重要
最后,MVCC 设计的优点显而易见,它允许 Postgres 为长时间运行的查询提供一致的快照(希望它们不会运行太长时间 😄)、为混合读写工作负载提供高并发性以及无需过多锁定即可实现强隔离。虽然 MVCC 设计并非 PostgreSQL 独有,但得益于这种方法,我们解决了大多数并发性问题。
锁定的目的
所有锁定,无论其类型如何,都会降低吞吐量,并可能增加延迟,这意味着性能损失,因为没有什么是免费的。如果我的目的是确保我的数据没有损坏,并且每个人在查询时都能得到正确的结果,我必须同意,当多个事务针对同一张表或同一行时,我必须锁定访问权限,以确保我们花一些时间来保持事物的顺序,而不是快速显示错误的结果。
但是我们也不能长时间保持锁定,因为这也会带来后果。让我们想象一下两个极端:我们从不锁定任何交易。一份长期运行的财务报告正在计算各部门的平均值,而人力资源部门正在处理年终加薪,同时,我们尝试添加一个新的审计列。在 PostgreSQL 中,即使没有显式锁定,添加列也需要AccessExclusiveLock在表上锁定。如果我们以某种方式绕过这一点(想象一个假设的不安全模式),我们将看到真正的混乱:工资更新可能会失败,因为它们在交易中遇到不同的表结构,并且后续查询可能会面临数据损坏,因为系统目录与实际表数据不一致。听起来很忙乱,但不锁定任何东西会造成不同程度的混乱。
现在,让我们考虑另一个极端:我们锁定每个操作,每个操作都等待另一个操作;一个操作完成,另一个操作开始。我们为一个正在读取的查询阻止整个表。如果几个用户(可能使用小型数据库)从来不需要同时查询同一张表,那么这也是可以接受的;就像运行夜间报告的单用户会计系统一样。
当我们需要同时为多个用户提供服务时,我们必须接受一定程度的隔离,因此我们要确保遵守一个标准,以确保不会出现脏读或幻读等情况。这就是为什么 Postgres 提供从“已提交读”到“可序列化”等不同隔离级别的原因。
DDL 锁
MVCC 方法使 PostgreSQL 能够高效地执行并发 DML 操作。写入操作不会就地修改数据,而是创建数据的新副本,从而允许读取和写入操作不相互阻塞地进行。但是,即使在基于 MVCC 的系统中,某种程度的锁定也是不可避免的。读取操作可能不会阻塞写入操作,但它们仍会获取表、类型和视图等数据库对象上的轻量级锁定。
因此,MVCC 可以防止写入阻塞读取,但无法防止 DDL 命令占用对象锁定。同一 DDL 命令的不同变体可能需要不同级别的锁定强度。
对于 DDL 操作(例如ALTER TABLE或VACUUM FULL),通常需要更强的锁定,这可能会阻止其他操作。此类操作可能会阻止其他 DDL 命令、DML 操作,甚至试图访问同一对象的 SELECT 查询。由于每个 DDL 命令(有时甚至是子命令)都有自己特定的锁定要求,因此复杂性会增加,因此了解繁忙数据库中架构修改的影响至关重要。
表级锁定模式
让我们看一下各种表级锁模式,每种模式都服务于不同的操作:
-
ACCESS SHARE:操作使用的最基本的锁SELECT,多个事务可以同时持有此锁,限制最少。
-
ROW SHARE:由使用SELECTFOR UPDATE/SHARE,与除排他锁之外的大多数其他锁兼容。
-
ROW EXCLUSIVE:DML操作必需(INSERT/UPDATE/DELETE/MERGE)
-
共享更新独占VACUUM:由、ANALYZE和 等维护操作使用,与、、、CREATE INDEX
CONCURRENTLY冲突。ShareLockShareRowExclusiveLockExclusiveLockAccessExclusiveLock -
分享:需要CREATE INDEX SHARE ROW EXCLUSIVE:创建触发器时使用
-
EXCLUSIVE:对于以下操作是必需的REFRESH MATERIALIZED VIEW CONCURRENTLY ACCESS
-
EXCLUSIVE:最强的锁,由DROP TABLE、TRUNCATE、某些ALTER TABLE命令和 等操作使用VACUUM FULL。限制性最强,阻止所有并发访问,并且是大多数架构修改所必需的。
我认为,了解哪些操作获得哪些锁很重要,但可以轻松检查。 理解锁模式如何相互作用可能更为重要。 不同的锁模式与其他不同的模式发生冲突。
冲突的锁定模式
有几个关键点需要理解,ACCESS EXCLUSIVE与所有内容都相冲突,包括ACCESS SHARE ( SELECT)。Postgres 进行了许多优化,以便在可能的情况下采用较弱的锁定模式。然而,没有什么是完美的,它仍然会对某些 DDL 操作采取强锁。一旦事务采取了强锁,即使语句已完成,它也会持有该锁。
一个重要的教训是,DDL 操作可能会在整个事务期间阻塞写入和读取。因此,避免将需要强锁的命令与同一事务中的其他命令混合使用至关重要。例如,如果您需要同时执行表更改和数据更新,最好将它们分成不同的事务以最大限度地减少阻塞。
了解 Postgres 中的锁队列
当事务请求的锁与另一个事务已持有的锁冲突时,它将进入锁队列。默认情况下,请求事务将无限期等待,直到锁可用。这些等待的锁形成一个队列,但不幸的是,这个队列在系统视图中不直接可见pg_locks。相反,您可以使用该pg_blocking_pids()函数来识别哪些后端正在阻止特定后端。
队列中位于前面的锁可能会阻塞位于其后面的锁,从而导致级联延迟。例如:
- 长期运行SELECT持有ACCESS SHARE LOCK。
- 需要ALTER TABLE DETACH PARTITION简短的访问独占锁
- 但它们发生冲突因此ALTER TABLE被放入锁队列中。
- 另外 20个后端正在尝试执行简单的主键查找SELECT。
- 但它们与ALTER TABLE的锁发生冲突,所以它们排在ALTER TABLE操作后面。
- 现在,对给定表的所有访问都排队在后面,并且在长时间运行SELECT和ALTER TABLE两者都完成之前不会进行处理。
这种累积等待会严重影响性能,尤其是在高并发环境中。用于lock_timeout限制事务等待锁定的时间。对于 DDL 操作,设置lock_timeout通常足以防止复杂的等待情况。但是,在实现超时时,您的应用程序必须准备好妥善处理故障,通常是通过为超时的 DDL 操作实现重试逻辑。
从中得到的最大启示是,任何长时间运行的查询都可能在模式更改期间造成阻塞,但可以通过设置适当的值来减轻这种累积等待效应lock_timeout。
将所有东西锁在一起
我注意到这篇博客已经很长了,我还有很多话要说。所以,我将在这里结束它,并写一篇后续文章来讨论锁争用以及如何在必要时最大限度地减少锁的影响。
到目前为止,我们已经探讨了 MVCC 如何帮助处理并发事务,以及各种锁定模式如何保护数据完整性。我们已经看到,锁定的范围从更宽松的ACCESS SHARE到更严格的ACCESS EXCLUSIVE,每种锁定在维护数据一致性方面都发挥着至关重要的作用。虽然 MVCC 避免了许多传统的锁定问题,但某种程度的锁定仍然是不可避免的。关键是找到正确的平衡,锁定太少会导致数据损坏的风险,而锁定太多会造成不必要的瓶颈。
总而言之,以下是本博客的要点:
- MVCC 将保护您免受写入阻止读取的损害,但不能保护您免受 DDL 所采取的对象锁的损害。
- 同一个 DDL
- 命令的不同变体可能需要非常不同的锁强度。 DDL 可能会阻止事务整个运行期间的写入和/或读取。
- 不要将需要强锁的命令与在同一事务中工作的其他命令混合。
- 用于lock_timeout限制等待锁的时间。 用于lock_timeoutDDL
- 命令通常就足够了。必须能够处理故障,例如再次重试 DDL。
#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证
相关文章:
【PGCCC】PostgreSQL 中表级锁的剖析
本博客解释了 PostgreSQL 中的锁定机制,重点关注数据定义语言 (DDL) 操作所需的表级锁定。 锁定还是解锁的艺术? 人们通常将数据库锁与物理锁进行比较,这甚至可能导致您订购有关锁的历史、波斯锁和撬锁技术的书籍。我们大多数人可能都是通过…...
1.10 自洽性(Self-Consistency):多路径推理的核心力量
自洽性(Self-Consistency):多路径推理的核心力量 随着人工智能尤其是大规模语言模型的不断进化,如何提升其推理能力和决策准确性成为了研究的重点。在这一背景下,**自洽性(Self-Consistency)**作为一种新的推理方法,逐渐展现出其强大的潜力。自洽性方法通过多路径推理…...
【24】Word:小郑-准考证❗
目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…...
Linux 信号(Signal)详解
信号(Signal)是 Linux 系统中用于进程间通信的一种机制。它是一种异步通知,用于通知进程发生了某个事件。信号可以来自内核、其他进程或进程自身。 信号的基本概念 信号的作用: 通知进程发生了某个事件(如用户按下 Ct…...
【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标!说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站点…...
app版本控制java后端接口版本管理
java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…...
2024年度总结-CSDN
2024年CSDN年度总结 Author:OnceDay Date:2025年1月21日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…...
基于python的博客系统设计与实现
摘要:目前,对于信息的获取是十分的重要,我们要做到的不是裹足不前,而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能,博主在发表文章后,互联网上的其他用户便可以看到,…...
服务器日志自动上传到阿里云OSS备份
背景 公司服务器磁盘空间有限,只能存近15天日志,但是有时需要查看几个月前的日志,需要将服务器日志定时备份到某个地方,需要查询的时候有地方可查。 针对这个问题,想到3个解决方法: 1、买一个配置比较低…...
优化使用 Flask 构建视频转 GIF 工具
优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中,我们将实现以下功能: 可设置每个 GIF 的帧率和大小:用户可以选择 GIF 的帧率和输出大小。改进的用户界面:使用更现代的设计使界面更美观、整洁。自定义…...
leetcode:511. 游戏玩法分析 I
难度:简单 SQL Schema > Pandas Schema > 活动表 Activity: ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_playe…...
windows git bash 使用zsh 并集成 oh my zsh
参考了 这篇文章 进行配置,记录了自己的踩坑过程,并增加了 zsh-autosuggestions 插件的集成。 主要步骤: 1. git bash 这个就不说了,自己去网上下,windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…...
【Python运维】Python与网络监控:如何编写网络探测与流量分析工具
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着互联网技术的快速发展,网络性能的监控与分析成为保障信息系统稳定运行的关键环节。本文深入探讨了如何利用Python语言构建高效的网络探…...
OpenCV相机标定与3D重建(61)处理未校准的立体图像对函数stereoRectifyUncalibrated()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为未校准的立体相机计算一个校正变换。 cv::stereoRectifyUncalibrated 是 OpenCV 库中的一个函数,用于处理未校准的立体图像对。该函…...
字玩FontPlayer开发笔记12 Vue3撤销重做功能
字玩FontPlayer开发笔记12 Vue3撤销重做功能 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码:github | gitee 笔记 撤销重做功能是设计工具必不可少的模块,以前尝试使用成熟的库实现撤销重做功能…...
无人机图传模块:深入理解其工作原理与实际效用
无人机图传模块作为无人机系统的关键组成部分,承担着将无人机拍摄的图像和视频实时传输至地面控制站或接收设备的重任。本文将深入探讨无人机图传模块的工作原理及其在实际应用中的效用,帮助读者更好地理解这一技术的奥秘。 一、无人机图传模块的工作原…...
PDF文件提取开源工具调研总结
概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息࿰…...
Linux(Centos 7.6)命令详解:dos2unix
1.命令作用 将Windows格式文件件转换为Unix、Linux格式的文件(也可以转换成其他格式的) 2.命令语法 Usage: dos2unix [options] [file ...] [-n infile outfile ...] 3.参数详解 options: -c, --convmode,转换方式,支持ascii, 7bit, iso, mac,默认…...
梯度提升决策树树(GBDT)公式推导
### 逻辑回归的损失函数 逻辑回归模型用于分类问题,其输出是一个概率值。对于二分类问题,逻辑回归模型的输出可以表示为: \[ P(y 1 | x) \frac{1}{1 e^{-F(x)}} \] 其中 \( F(x) \) 是一个线性组合函数,通常表示为ÿ…...
跨域问题分析及解决方案
1、跨域 指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 2、同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域; 3、跨域流程…...
【三国游戏——贪心、排序】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…...
深入理解 Java 的数据类型与运算符
Java学习资料 Java学习资料 Java学习资料 在 Java 编程中,数据类型与运算符是构建程序的基础元素。它们决定了数据在程序中的存储方式以及如何对数据进行各种操作。 一、数据类型 (一)基本数据类型 整型: 用于存储整数数值&…...
WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测
WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测 目录 WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于WOA-CNN-GRU-Attention、…...
(二叉树)
我们今天就开始引进一个新的数据结构了:我们所熟知的:二叉树; 但是我们在引进二叉树之前我们先了解一下树; 树 树的概念和结构: 树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) …...
Linux shell 批量验证端口连通性
脚本 #!/bin/bash # #database check #set -o nounset LOCALIPifconfig | grep inet | head -1 | awk {print $2} | sed s/addr\:// IPLIST192.168.1.99 192.168.1.98 192.168.1.97 PORTLIST81 82 83 84 85 86 check_nc(){ for CHECK_IP in $IPLIST dofor CHECK_PORT in $PORT…...
Java 中实体类与操作类分离
目录 一、为啥要把实体类和操作类分开 二、实体类长啥样,怎么用 三、操作类的使命与实现 四、实战演练:实体类与操作类协同工作 五、拓展思考:这种分离带来的好处与进一步优化 六、总结与展望 家人们,今天我想跟你们唠唠我在…...
创建 pdf 合同模板
创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…...
【Prometheus】PromQL进阶用法
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
BOBO小火炬全套源码XE修复版2025(火炬天花板二次开发版)
《小火炬全套源码 传奇游戏源码讲解》 小火炬全套源码是一种用于开发经典传奇类游戏的源码包。传奇游戏作为一款经典的多人在线角色扮演游戏(MMORPG),有着庞大的用户基础和强大的游戏生态。小火炬全套源码主要提供了从基础架构到核心功能的完…...
【基于无线电的数据通信链】Link 11 仿真测试
〇、废话 Link 11 仿真测试 涉及多个方面,包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF(高频) 或 UHF(超高频) 波段的无线通信协议,主要用于军事通信系统中。为了…...
WPF实战案例 | C# WPF实现计算器源码
WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计(XAML)2.2 代码逻辑(C#)2.3 实现步骤总结 源码下载更多优质源码分享 作者:xcLeigh 文章地址&a…...
WebSocket 和 Socket 的区别
一、协议层次和工作方式 1.1 )Socket 1.1.1)Socket位于传输层,通常使用TCP或UDP协议 1.1.2)提供了一个通用的网络编程接口,允许应用程序通过它发送和接收数据 1.1.3)一般需要手动管理连接,错…...
Matlab自学笔记四十五:日期时间型和字符、字符串以及double型的相互转换方法
1.说明 在Matlab中,大多数函数都有这样的功能:创建函数本身具有转换的功能,例如double函数,可以创建双精度浮点数,也可以把输入参数转换成双精度浮点数,再例如string,可以创建字符串࿰…...
Python基础学习(六)unittest 框架
1.介绍 是 Python自带的单元测试框架 - 自带的, 可以直接使用, 不需要单外安装 - 测试人员,用来做自动化测试, 作为自动化测试的执行框架,即管理和执行用例的 核心要素: TestCase 测试用例, 这个测试用例是 unittest 的组成部分,作用是用来书写真正的…...
Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具
我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化࿰…...
麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构,但是PHP对于技术来说确实是老掉牙了,PHP的市场占有量越来越少了,我认识一个10年的PHP开发工程师,十年工资从15k到今天的6k&am…...
Docker集成onlyoffice实现预览功能
1.拉取镜像 docker pull onlyoffice/documentserver 2. 数据卷挂载 mkdir -p app/onlyoffice/DocumentServer/logs mkdir -p app/onlyoffice/DocumentServer/data mkdir -p app/onlyoffice/DocumentServer/lib mkdir -p app/onlyoffice/DocumentServer/db 3.运行容器 docker ru…...
Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配
文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…...
BladeDISC++:Dynamic Shape AI 编译器下的显存优化技术
近年来,随着深度学习技术的迅猛发展,越来越多的模型展现出动态特性,这引发了对动态形状深度学习编译器(Dynamic Shape AI Compiler)的广泛关注。本文将介绍阿里云 PAI 团队近期发布的 BladeDISC项目,探讨在动态场景下如何优化深度…...
FFmpeg常用命令
文章目录 一、 FFmpeg 音视频的处理流程二、FFmpeg 常用命令2.1、查看本机支持的采集设备2.2、 录制视频2.2.1、原始视频2.2.2、编码的视频 2.3、录制音频:2.3.1、原始音频2.3.2、编码的音频 2.4、录制音视频:2.5、文件格式转换:2.6、提取音频…...
http请求开启长连接导致请求偶发失败
问题描述: http长连接的意思是服务器为了调用时减少TCP三次握手开销,会复用之前已经发起的请求,比较适合频繁交互(比如数据推送、流水线操作等)的场景,但是如果超过服务器配置的连接最大空闲时间࿰…...
JUnit单元测试
单元测试 就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试 JUnit 最流行的java测试框架之一,方柏霓进行单元测试 入门程序 使用Junit,对UserService的方法进行单元测试 1.在pom.xml中,…...
智慧公安(实景三维公安基层基础平台)建设方案——第4章
4 建设内容 4.1 标准规范体系 在国家和地方公安基层信息化标准规范的基础上,结合项目实际情况,制定标准规范及管理制度,构建统一的标准规范体系,以便更好地实现公安基层基础信息的高度共享、平台运行的统一协调、业务流程最优化。主要包括以下内容: 1. 业务标准规范 (…...
LLMs(大型语言模型)的多智能体:Auto-GPT
LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…...
《Effective Java》学习笔记——第2部分 对象通用方法最佳实践
文章目录 第2部分 所有对象通用方法一、前言二、最佳实践内容1. equals()方法2. hashCode()方法3. toString() 方法4. clone() 方法5. finalize() 方法6. compareTo()方法(实现 Comparable 接口) 三、小结 第2部分 所有对象通用方法 一、前言 《Effect…...
2024年智慧消防一体化安全管控年度回顾与2025年预测
随着科技的飞速发展,智慧营区一体化安全管控在2024年取得了显著进展,同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大:国家对消防安全的重视程度不断提高,出台了一系列涵盖技术创新、市场应用、人才培…...
艺术家迟首飞在特殊历史时刻展现中国艺术力量
艺术家迟首飞在特殊历史时刻展现中国艺术力量 艺术创作的边界正被不断拓展。中国艺术家迟首飞以其纪实视野,将传统与现代元素巧妙融合,展现全球艺坛力量,创作出一系列精彩作品。尤其是《平安兔》《福》与TikTok标志的结合的作品,…...
探索微服务架构:从单体应用到微服务的转变
引言 随着互联网业务的日益复杂和用户需求的快速增长,软件开发的架构模式也在不断演进。从最早的单体应用架构到后来的分层架构,再到如今备受关注的微服务架构,每一种架构模式都试图解决软件开发中的不同挑战。尤其是在现代互联网企业中&…...
MongoDB vs Redis:相似与区别
前言 在当今的数据库领域,MongoDB 和 Redis 都是备受关注的非关系型数据库(NoSQL),它们各自具有独特的优势和适用场景。本文将深入探讨 MongoDB 和 Redis 的特点,并详细对比它们之间的相似之处和区别,帮助…...
Jenkins-pipeline语法说明
一. 简述: Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile: 1. Sections部分: Pipeline里的Sections通常包含一个或多个Direc…...