Golang 中 Goroutine 的调度
Golang 中 Goroutine 的调度
Golang 中的 Goroutine 是一种轻量级的线程,由 Go 运行时(runtime)自动管理。Goroutine 的调度基于 M:N 模型,即多个 Goroutine 可以映射到多个操作系统线程上执行。以下是详细的调度过程和策略:
1. 创建 Goroutine
- 使用
go
关键字可以创建一个新的 Goroutine。例如:
go func() {// 任务代码}()
- 创建 Goroutine 的底层方法是
newproc
函数,该函数会创建一个新的 Goroutine 并将其放入 P 的本地队列中。如果本地队列已满,则放入全局队列中。
2. 调度器(Scheduler)
- Go 运行时包含一个调度器,负责管理 Goroutine 的执行。调度器的主要任务是从全局队列或本地队列获取可执行的 Goroutine,并将其分配给可用的线程(M)执行。
- 调度器采用队列轮转法,确保每个 Goroutine 都有机会被执行。具体来说,调度器会从 P 的本地队列中获取 Goroutine 执行;如果本地队列为空,则从全局队列获取;如果全局队列也为空,则从其他 P 的本地队列中“偷取”一半数量的 Goroutine(称为 work stealing)。
3. Goroutine 的状态
- Goroutine 可能处于多种状态,包括
_Grunning
(正在运行)、_Gwaiting
(等待中)、_Gblocked
(阻塞中)等。 - 当一个 Goroutine 完成其任务后,会调用
goexit
函数,该函数会将当前 Goroutine 放入 P 的复用链表中,并调用schedule()
函数继续调度下一个 Goroutine。
4. 抢占式调度
- Go 调度器是抢占式的,每个 Goroutine 最多执行 10ms 后会被替换。如果 Goroutine 运行超过 10ms,调度器会设置“抢占标志位”,但这一机制仅在有函数调用的情况下生效。
- 当 Goroutine 发生阻塞(如等待通道、垃圾回收、sleep 休眠、锁等待、IO 阻塞等),调度器会将当前 Goroutine 调度走,让其他 Goroutine 来执行。
5. 调度时机
- 调度时机包括但不限于:Goroutine 完成任务、发生阻塞、系统调用、垃圾回收等。
sysmon
是一个专门用于监控和管理 Goroutine 的线程,它记录所有 P 的 G 任务数量,并使用schedtick
变量进行计数。如果schedtick
一直没有递增,说明该 P 一直在执行同一个任务;如果持续超过 10ms,则会在该 G 任务的栈信息上加一个标记,G 任务在执行时检查此标记并中断自己,将自己添加到队列末尾,等待下一个 G 任务执行。
6. 核心数据结构
- Go 运行时维护了三个核心数据结构:G(Goroutine)、P(Processor)、M(Machine)。
- G 表示 Goroutine,每个 Goroutine 对应一个 G 结构体,存储其运行堆栈、状态和任务函数。
- P 表示 Processor,相当于 CPU 核,为 G 提供执行环境。
- M 是 OS 线程抽象,负责调度任务,代表真正执行计算的资源。
7. 调度流程
- 当一个程序启动时,只有一个主 Goroutine 来调用
main
函数。在运行过程中,可以通过go
关键字创建新的 Goroutine。 - M 需要绑定一个 P 才能被调度执行,并在绑定后进入
schedule
循环,从全局队列或 P 的本地队列获取 Goroutine 并执行。 - 当 M 执行完一个 Goroutine 后,会调用
goexit
和goexit1
函数,保存当前 Goroutine 的上下文,切换到 g0 及其栈,调用传入的方法。最后,goexit0
函数清零 Goroutine 属性,状态从_Grunning
改为_Gdead
,解绑 M 和 Goroutine,放入队列,重新调度。
总结
Golang 的 Goroutine 调度机制通过 M:N 模型实现了高效的并发执行。调度器负责管理 Goroutine 的生命周期和执行顺序,确保每个 Goroutine 都有机会被执行。通过抢占式调度和 work stealing 策略,Go 运行时能够高效地利用系统资源,实现高性能的并发编程。
Goroutine 和 OS 线程之间的映射机制是如何工作的?
Goroutine 和 OS 线程之间的映射机制主要通过 Go 运行时的调度器实现,采用 M:N 模型。这种模型允许将多个 goroutine 映射到较少数量的 OS 线程上,从而提高并发执行的效率。
具体来说,Go 运行时内部包含三个关键结构:M(Machine,即 OS 线程)、G(Goroutine)和 P(调度上下文)。M 代表真正的内核线程,G 代表用户态定义的协程,而 P 则负责调度,实现从 N:1 到 N:M 的用户空间线程与内核空间线程的映射。
在 Go 程序启动时,会创建一个或多个 OS 线程,并在这些线程上调度执行 goroutine。当一个 goroutine 需要执行时,Go 运行时会从线程池中选出一个可用的 M 或者新建一个 M。当一个 goroutine 阻塞(如进行 I/O 操作)时,Go 运行时可以将 P 转移到另一个 M 上继续执行其他 goroutine,从而提高 CPU 的利用率。
此外,Go 运行时还引入了 GOMAXPROCS 配置参数,它决定了 Go 代码可以同时执行的 OS 线程数量。通过调整该参数,开发者可以优化应用性能,但需平衡过高设置可能导致的资源竞争和上下文切换开销增加。
Go 调度器在不同操作系统(如 Linux 和 Windows)上的实现差异有哪些?
Go 调度器在不同操作系统(如 Linux 和 Windows)上的实现存在一些差异,主要体现在 I/O 多路复用机制和调度策略上。
-
I/O 多路复用机制:
- Linux:Go 语言的运行时调度器在 Linux 上使用了
epoll
机制来实现 I/O 多路复用。epoll
是一种高效的事件驱动机制,能够处理大量并发的网络连接和 I/O 操作,从而提高系统的性能和响应速度。 - Windows:在 Windows 上,Go 语言的运行时调度器使用了
IOCP
(I/O Completion Port)机制。IOCP
是 Windows 特有的事件驱动机制,同样能够高效地处理大量并发的 I/O 操作。
- Linux:Go 语言的运行时调度器在 Linux 上使用了
-
调度策略:
- Linux:Linux 的进程调度器将线程作为最小调度单位,通过调度类的概念引入不同的调度策略来平衡低延时和实时性的问题。
- Go 调度器:Go 调度器在用户层建立了新的模型,以 Goroutine 作为最小调度单位。这种设计使得 Go 调度器能够在用户态进行调度,减少了操作系统线程调度和上下文切换的开销。此外,Go 调度器还采用了工作窃取(Work Stealing)的方式,通过运行队列进行分区,平衡不同 CPU 或线程上的运行队列。
-
系统调用处理:
- Linux:Linux 系统调用通常由内核直接处理,而 Go 调度器需要通过用户态的机制来处理这些系统调用,例如使用
epoll
来处理网络请求和 I/O 操作。 - Windows:在 Windows 上,Go 调度器使用
IOCP
来处理系统调用,这同样是一种高效的事件驱动机制,能够有效地处理大量并发的 I/O 操作。
- Linux:Linux 系统调用通常由内核直接处理,而 Go 调度器需要通过用户态的机制来处理这些系统调用,例如使用
-
调度器架构的演变:
- 早期 Go 调度器:最早期的 Go 调度器(Go 1 之前)甚至不能很好地支持多线程,最大 M 数为 1。这个版本的调度器在 Linux 上实现,但在其他操作系统上的支持并不完善。
- 现代 Go 调度器:从 Go 1.1 起,引入了工作窃取调度器,大大提高了调度效率和并发性能。现代 Go 调度器在不同操作系统上都进行了优化,以适应各自的 I/O 多路复用机制和调度策略。
综上所述,Go 调度器在不同操作系统上的实现差异主要体现在 I/O 多路复用机制和调度策略上。Linux 上使用 epoll
,而 Windows 上使用 IOCP
。
如何优化 Go 程序中的 Goroutine 使用以提高性能?
优化 Go 程序中的 Goroutine 使用以提高性能,可以从以下几个方面进行:
-
合理控制 Goroutine 数量:
- 过多的 Goroutine 会导致系统资源的过度消耗,甚至引发 Goroutine 泄露问题。因此,应根据实际需求合理控制 Goroutine 的数量,避免过度并发。
- 使用 Goroutine 池化技术可以减少 Goroutine 的创建和销毁开销,从而提高性能。
-
优化 Channel 的使用:
- Channel 是 Goroutine 之间通信的主要方式,但 Channel 的传递大数据会带来值拷贝的开销。因此,尽量避免在 Channel 中传递大数据。
- 使用 Channel 时,应尽量避免阻塞和死锁问题,确保 Channel 的使用高效且安全。
-
减少锁的使用:
- 锁是并发编程中常见的同步机制,但过度使用锁会导致性能下降。Go 推荐使用 Channel 的方式调用而不是共享内存,因为 Channel 之间存在大锁,可以降低锁的竞争力度。
- 无锁编程通过原子操作减少锁的使用,可以进一步提升并发性能。
-
使用 Context 控制 Goroutine 生命周期:
- 设置超时和使用
context.WithTimeout
可以有效管理 Goroutine 的生命周期,避免 Goroutine 泄露。
- 设置超时和使用
-
减少系统调用:
- Goroutine 的实现是通过同步模拟异步操作,建议将同步调用隔离到可控 Goroutine 中,而不是直接高并发调用。
-
使用性能分析工具:
- 使用 Go 提供的性能分析工具如 pprof 和 trace,可以帮助检测 Goroutine 的运行时间、资源占用等,从而对 Goroutine 的创建和管理进行优化。
-
合理设置 GOMAXPROCS:
- GOMAXPROCS 控制了 Go 运行时可以使用的最大工作线程数。合理设置 GOMAXPROCS 可以提高并发性能。
-
避免内存泄漏:
- 在使用切片和映射时要合理设置容量,避免内存泄漏。
Goroutine 的抢占式调度机制具体是如何实现的?
Goroutine 的抢占式调度机制在 Go 语言中是通过多种方式实现的,主要包括基于协作的抢占和基于信号的抢占。以下是详细的实现机制:
-
基于协作的抢占:
- Goroutine 栈保护:每个 Goroutine 都有一个
stackguard0
字段,当该字段被设置为StackPreempt
时,Goroutine 将被抢占。这个机制确保在函数调用时,调度器可以检查并触发抢占。 - 抢占函数:Go 运行时引入了
preemptone
和preemptall
函数,这些函数会设置 Goroutine 的StackPreempt
标志,从而触发抢占。 - 垃圾回收抢占:在垃圾回收阶段,运行时会调用
preemptall
函数设置所有处理器上 Goroutine 的StackPreempt
标志,以确保垃圾回收期间所有 Goroutine 都能被抢占。 - 长时间运行的 Goroutine 抢占:如果一个 Goroutine 的运行时间超过 10ms,系统监控线程(sysmon)会调用
retake
和preemptone
函数进行抢占。
- Goroutine 栈保护:每个 Goroutine 都有一个
-
基于信号的抢占:
- 信号处理:在 Go 1.14 版本中,引入了基于信号的抢占机制。当系统处于特定状态(如 STW、执行 safe point 函数、sysmon 监控期间等)时,会向线程发送
SIGURG
信号。 - 抢占处理函数:当线程收到
SIGURG
信号后,会调用asyncPreempt
函数,将asyncPreempt
的调用强制插入到用户当前执行的代码位置,从而实现真正的抢占。
- 信号处理:在 Go 1.14 版本中,引入了基于信号的抢占机制。当系统处于特定状态(如 STW、执行 safe point 函数、sysmon 监控期间等)时,会向线程发送
-
系统调用引起的抢占:
- sysmon 线程监控:sysmon 线程负责监控系统资源和调度 Goroutine。当发现某个 Goroutine 执行系统调用时间过长时,会调用
retake
函数进行抢占。 - 抢占逻辑:在抢占过程中,sysmon 会释放系统调用线程所绑定的 P(进程),而非阻止线程进行系统调用,而是合理利用资源。
- sysmon 线程监控:sysmon 线程负责监控系统资源和调度 Goroutine。当发现某个 Goroutine 执行系统调用时间过长时,会调用
-
调度器的抢占流程:
- 抢占时机:抢占式调度在以下场景下触发:Goroutine 执行时间过长、执行较长的函数调用链或栈帧扩展时。
- 抢占行为:当 Goroutine 被标记为需要抢占时,调度器会将其放入全局可运行队列中,并更新其状态为
_Runnable
,然后继续调度其他 Goroutine。
通过上述机制,Go 调度器能够确保在大部分情况下,不同的 Goroutine 都能获得均匀的时间片,提高了程序的可靠性和稳定性。
在高并发场景下,Goroutine 的调度策略对系统资源的利用效率有何影响?
在高并发场景下,Goroutine 的调度策略对系统资源的利用效率有显著影响。以下是详细的分析:
-
抢占式调度:Go 运行时系统实现了抢占式调度,以确保 Goroutine 公平地获得执行时间。如果一个 Goroutine 长时间占用 CPU(大约 10ms),运行时系统会抢占它,将其放回运行队列,并允许其他 Goroutine 执行。这种机制可以防止某个 Goroutine 占用过多资源,从而提高整体系统的资源利用率。
-
工作窃取算法:当一个 P(逻辑处理器)的本地运行队列为空时,它会尝试从其他 P 的本地运行队列中“偷取” Goroutine,以保持 CPU 的利用率。这种工作窃取算法避免了全局锁的使用,提高了调度效率,特别是在多核处理器上,可以更好地平衡负载。
-
优先级调度:Goroutine 的优先级是由 Go 运行时根据任务的优先级来设置的。优先级高的 Goroutine 会得到更多的资源分配,因此可以更快地执行。然而,在一些高并发场景下,大量请求 Goroutine 和其他工作 Goroutine 数量级差别较大,导致调度不合理,有时会导致调度不均衡。
-
资源分配:Goroutine 的资源分配是由 Go 运行时根据任务的资源需求来设置的,包括 CPU 时间片和内存空间等。在高并发场景下,频繁创建和销毁 Goroutine 可能会导致垃圾回收(GC)负担加重,影响系统响应速度。
-
锁竞争和优化:高频繁的锁竞争会导致性能瓶颈,特别是在高并发环境下。减少全局锁的使用和优化锁的策略可以提高系统的性能。
-
用户态调度:Goroutine 的调度在用户态进行,避免了内核态的资源争用和线程管理问题。这种机制使得 Goroutine 的切换更加高效,因为它们不依赖于操作系统提供的线程,而是通过用户态的切换实现。
-
GOMAXPROCS 参数:GOMAXPROCS 参数决定了同时可执行的 Goroutine 数量,默认值为 CPU 核心数。调整 GOMAXPROCS 参数可以影响调度行为,从而优化资源利用效率。
-
内存管理:Goroutine 的栈大小是动态调整的,从 2KB 开始,最大可达 1GB。这种动态调整机制使得 Goroutine 能够更高效地利用内存资源,避免了固定大小栈带来的浪费。
综上所述,Goroutine 的调度策略在高并发场景下对系统资源的利用效率有显著影响。通过合理的调度策略和优化方法,可以提高系统的性能和资源利用率。
相关文章:
Golang 中 Goroutine 的调度
Golang 中 Goroutine 的调度 Golang 中的 Goroutine 是一种轻量级的线程,由 Go 运行时(runtime)自动管理。Goroutine 的调度基于 M:N 模型,即多个 Goroutine 可以映射到多个操作系统线程上执行。以下是详细的调度过程和策略&…...
MyBatis使用的设计模式
目录 1. 工厂模式(Factory Pattern) 2. 单例模式(Singleton Pattern) 3. 代理模式(Proxy Pattern) 4. 装饰器模式(Decorator Pattern) 5. 观察者模式(Observer Patt…...
淺談Cocos2djs逆向
前言 簡單聊一下cocos2djs手遊的逆向,有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念: Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio,區別是前者是cocos2djs專用的開發工具,後者則是coco…...
选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型
结构为类选择器 伪元素选择器 PxCook 盒子模型 (内外边距,边框) 内外边距合并,塌陷问题 元素溢出 圆角 阴影: 模糊半径:越大越模糊,也就是越柔和 案例一:产品卡片 <!DOCTYPE html> <html lang&q…...
CentOS 7系统 OpenSSH和OpenSSL版本升级指南
文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...
使用 Comparable 和 Comparator 接口对集合排序
使用 Comparable 和 Comparator 接口对集合排序: 1. 使用 Comparable 接口: 当你希望一个类的对象能够按照某种自然顺序进行排序时,可以实现 Comparable 接口 并重写 compareTo() 方法。 实现步骤: 1.1 实现 Comparable<T&g…...
最新常见的图数据库对比,选型,架构,性能对比
图数据库排名 地址:https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性 SPARQL Cypher Gremlin PGQL G-CORE 图模式匹配查询 语法 CGP CGP CGP(无可选)1 CGP CGP 语义 子…...
混合合并两个pdf文件
混合两个pdf 1、在线免费交替和混合奇数和偶数PDF页面2、有什么软件把两个 PDF 交叉合并?3、pdfsam本地合并 如何Google翻译的原文和译文合并,(沉浸式翻译效果相对较好) 1、在线免费交替和混合奇数和偶数PDF页面 https://deftpd…...
OpenCV-Python实战(9)——滤波降噪
一、均值滤波器 cv2.blur() img cv2.blur(src*,ksize*,anchor*,borderType*)img:目标图像。 src:原始图像。 ksize:滤波核大小,(width,height)。 anchor:滤波核锚点,…...
uniapp——微信小程序读取bin文件,解析文件的数据内容(三)
微信小程序读取bin文件内容 读取用户选择bin文件,并解析数据内容,分包发送给蓝牙设备; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档: getFileSystemManager 关于App端读取bin文件,请查看&…...
Python 中常用的算法
1. 排序算法 用于将数据按特定顺序排列。 冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)快速排序(Quick Sort)归并排序(Merge Sort…...
xadmin后台首页增加一个导入数据按钮
xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang...
Kubernetes: NetworkPolicy 的实践应用
一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...
计算机体系结构期末复习3:GPU架构及控制流问题
目录 一、GPU设计思路 1.简化流水线、增加核数 2.单指令多线程(SIMT) 3.同时驻留大量线程 4.总思路:多线程单指令多线程 二、GPU的控制流问题 1.什么是控制流问题 2.怎么应对分支分歧 一、GPU设计思路 1.简化流水线、增加核数 2.单指…...
excel怎么删除右边无限列(亲测有效)
excel怎么删除右边无限列(亲测有效) 网上很多只用第1步的,删除了根本没用,还是存在,但是隐藏后取消隐藏却是可以的。 找到右边要删除的列的第一个空白列,选中整个列按“ctrlshift>(向右的小箭头)”&am…...
ChatGPT-4助力学术论文提升文章逻辑、优化句式与扩充内容等应用技巧解析。附提示词案例
目录 1.扩写(expansion/paraphrasing) 2.优化(optimization) 3.缩写(optimization) 4.提取关键词(keyword extraction) 5.短语转换(phrase transformationÿ…...
C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)
1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…...
html+css网页制作 美食 美食网5个页面
htmlcss网页制作 美食 美食网5个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1࿰…...
Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length
背景:因为某些原因需要从本地mac连接远程linxu桌面查看一些内容,必须使用桌面查看,所以ssh无法满足,所以决定安装vnc客户端。 问题: 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下: > D…...
遥感图像车辆检测-目标检测数据集
遥感图像车辆检测-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接: https://pan.baidu.com/s/1XVlRTVWpXZFi6ZL_Xcs7Rg?pwdaa6g 提取码: aa6g 数据集信息介绍: 共有 1035 张图像和一一对应的标注文件 标注文件格式提供了…...
51c自动驾驶~合集43
我自己的原文哦~ https://blog.51cto.com/whaosoft/12930230 #ChatDyn 上交大最新ChatDyn:一句话操纵三维动态 理解和生成真实的三维虚拟世界是空间智能的核心。所生成的三维虚拟世界能够为自动驾驶、具身智能等AI系统提供高质量闭环仿真训练场,高效…...
随机变量是一个函数-如何理解
文章目录 一. 随机变量二. 随机变量是一个函数-栗子(一对一)1. 掷骰子的随机变量2. 掷骰子的随机变量(求点数平方)3. 抛硬币的随机变量4. 学生考试得分的随机变量 三. 随机变量是一个函数-理解(多对一) 一. 随机变量 随机变量就是定义在样本空间上的函数…...
云计算在医疗行业的应用
云计算在医疗行业的应用广泛而深入,为医疗服务带来了前所未有的变革。以下是对云计算在医疗行业应用的详细解析: ### 一、医疗数据共享与整合 云计算平台具有强大的数据存储和处理能力,使得医疗数据共享与整合成为可能。通过云计算平台&…...
Cursor提示词
你是一位经验丰富的项目经理,对于用户每一次提出的问题,都不急于编写代码,更多是通过深思熱虑、结构化的推理以产生高质量的回答,探索更多的可能方案,并从中寻找最佳方案。 约束 代码必须可以通过编译回答尽量使用中…...
C++ 设计模式:单例模式(Singleton Pattern)
链接:C 设计模式 链接:C 设计模式 - 享元模式 单例模式(Singleton Pattern)是创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…...
C++中生成0到180之间的随机数
在C中生成0到180之间的随机数,可以使用标准库中的和头文件。提供了rand()函数来生成随机数,而提供了time()函数来设置随机数生成的种子。这样每次运行程序时,生成的随机数序列都会不同。 以下是一个简单的示例代码,展示了如何生成…...
[.闲于修.]Autosar_UDS_笔记篇_ISO14229-1
前言:闲来无事,摸鱼无趣,准备细读一下14229,记录一些容易被忽略掉的内容 正文:(以下数字代表章节) 7、Application layer protocol 7.5.6 多个并发请求消息 常见的服务器实现在服务器中只有一…...
如何利用云计算进行灾难恢复?
云计算环境下的灾难恢复实践指南 天有不测风云,企业的IT系统也一样,我见过太多因为没有做好灾备而吃大亏的案例。今天就和大家聊聊如何用云计算来做灾难恢复。 一个惊心动魄的真实案例:某电商平台的主数据中心因为市政施工不小心挖断了光纤…...
Redis - 1 ( 7000 字 Redis 入门级教程 )
一: Redis 1.1 Redis 简介 Redis 是一种基于键值对(key-value)的 NoSQL 数据库,与其他键值对数据库不同,Redis 的值可以是多种数据结构和算法的组合,如字符串(string)、哈希&#…...
[羊城杯 2024]不一样的数据库_2
题目描述: 压缩包6 (1).zip需要解压密码: 尝试用ARCHPR工具爆破一下: (字典可自行在github上查找) 解压密码为:753951 解压得到13.png和Kee.kdbx文件: 二维码图片看上去只缺了正常的三个角&…...
租赁系统的数字化转型与高效管理新模式分析
内容概要 在当今瞬息万变的市场环境中,租赁系统的数字化转型显得尤为重要。信息技术的迅猛发展不仅改变了我们的生活方式,也迫使企业重新审视其运营模式。为了顺应这一潮流,租赁系统亟需通过高效管理新模式来提升运营效率,从而保…...
Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案
问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…...
【每日学点鸿蒙知识】文字识别、快捷登录、输入法按钮监听、IDE自动换行、资产访问等
【每日学点鸿蒙知识】24.09.07 1、API使用: hms.ai.ocr.textRecognition(文字识别)? 需要接入API文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/core-vision-text-recognition-api-V5中的文字识别…...
LabVIEW化工实验室设备故障实时监测
化工实验室中,各类设备的运行状态直接影响实验的精度与安全性。特别是重要分析仪器的突发故障,可能导致实验中断或数据失效。为了实现设备运行状态的实时监控与故障快速响应,本文提出了一套基于LabVIEW的解决方案,通过多参数采集、…...
小程序学习05——uniapp路由和菜单配置
目录 一、路由 二、如何管理页面及路由? 三、pages.json 页面路由 四、 tabBar 一、路由 路由:在前端,往往指代用不同地址请求不同页面,决定了用户如何在应用的不同页面之间导航。 菜单:对于每个路径(…...
漏洞分析 | Apache Struts文件上传漏洞(CVE-2024-53677)
漏洞概述 Apache Struts是美国阿帕奇(Apache)基金会的一个开源项目,是一套用于创建企业级Java Web应用的开源MVC框架。 近期,网宿安全演武实验室监测到Apache Struts在特定条件下,存在文件上传漏洞(网宿评…...
【VBA】EXCEL - VBA 遍历工作表的 5 种方法,以及注意事项
目录 1. 遍历单列数据并赋值 2. 遍历整个工作表的数据区域并赋值 3. 遍历指定范围的数据并赋值 4. 遍历多列数据并赋值 5. 遍历所有工作表中的数据并赋值 注意事项: 1. 遍历单列数据并赋值 Sub UpdateColumnData()Dim ws As WorksheetSet ws ThisWorkbook.S…...
CSS浮动
浮动 可以让块级元素待在一行,紧挨着,没有空格 float:left 浮动的元素会脱离正常的文档系统,像浮云一样飘起来浮动元素后面的正常元素会自动补位浮动元素会被父元素的宽高所束缚,所以不算完全的脱离文档流当浮动元素…...
gitlab 还原合并请求
事情是这样的: 菜鸡从 test 分支切了个名为 pref-art 的分支出来,发布后一机灵,发现错了,于是在本地用 git branch -d pref-art 将该分支删掉了。之后切到了 prod 分支,再切出了一个相同名称的 pref-art 分支出来&…...
【GPT】Coze使用开放平台接口-【8】创建应用
coze 可以用来创建简单的应用啦,这样测试起来会比原本的 Agent 更加方便,我们来看看如何创建一个“语音Real不Real”的应用。这个应用就是来检测语音是否是伪造的,克隆或者是合成的。先看下原本 Agent 的样子: 深度伪造语音检测&a…...
海外盲盒系统开发,助力企业全球化发展
近几年来,在海外市场中,盲盒已经成为了一种新的时尚单品,深受东南亚等海外消费者的喜爱。同时,泡泡玛特在海外的成功也为国内企业提供了发展机遇,盲盒出海具有广阔的发展前景! 随着信息技术的快速发展&a…...
pytorch 梯度判断函数介绍
PyTorch 提供了一些函数用于判断当前的梯度计算状态以及张量是否需要梯度。这些函数帮助开发者在训练、推理和调试过程中了解和控制梯度计算行为。 PyTorch 梯度判断函数 1. torch.is_grad_enabled() 功能: 判断当前是否启用了全局的梯度计算状态。返回值: 布尔值,True 表…...
每日一题 367. 有效的完全平方数
367. 有效的完全平方数 低效率法 class Solution { public:bool isPerfectSquare(int num) {if(num 1){return true;}long num1 num;for(int i1;i< num/2;i){if((long)(i)*i num){return true;}}return false;} };二分法 class Solution { public:bool isPerfectSquar…...
图像转换 VM与其他格式互转
目录 前言 图像转换 1.相机取流转VM对应类型图像格式 1.1 相机采图转流程输入和Group输入(ImageBaseData_V2) 1.2 相机采图转图像源SDK输入(ImageBaseData) 1.3 相机采图转模块输入(InputImageData) 1.4 相机采图转算子输入(CmvdImage) 2.Bitmap取图与VM对应图像格式互…...
streamlit、shiny、gradio、fastapi四个web APP平台体验
streamlit、shiny、gradio、fastapi四个web APP平台体验 经常被问的问题就是:web APP平台哪个好?该用哪个?刚开始只有用streamlit和shiny,最近体验了一下gradio和fastapi,今天根据自己的体会尝试着回答一下。 使用R语…...
BootstrapTable处理表格
需求背景 历史项目使用 BootstrapTable 作为前端组件 应客户需要调整: 冻结前四列对于大文本文字显示部分内容,鼠标悬浮显示完整内容 冻结列 1、引入相关CSS,JS CSS <link rel"stylesheet" href"/css/bootstrap.min.css"> …...
家政预约小程序04活动管理表结构设计
目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销,我们通常需要搞一些活动,比如满减、折扣、团购等。启动活动后,会在首页进行显示,当用户访问小程序的时候,就可以参与活动…...
WPF使用OpenCvSharp4
WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中,右键单击项目名称,选择“管理 NuGet 包”。搜索并安装以下包: OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…...
STM32-笔记23-超声波传感器HC-SR04
一、简介 HC-SR04 工作参数: • 探测距离:2~600cm • 探测精度:0.1cm1% • 感应角度:<15 • 输出方式:GPIO • 工作电压:DC 3~5.5V • 工作电流:5.3mA • 工作温度:-40~85℃ 怎么…...
4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传
一、引言 在当今社会,安全问题始终是人们关注的重中之重。无论是家庭、企业还是公共场所,都需要一套可靠的安全防护系统来保障人员和财产的安全。随着科技的飞速发展,4G 报警器应运而生,为安全防范领域带来了全新的解决方案。…...