[每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器
文章目录
- 一、什么是 `sync.Pool`?
- 二、`sync.Pool` 的基本作用
- 三、`sync.Pool` 的主要方法
- 四、`sync.Pool` 的内部工作原理
- 五、`sync.Pool` 适用场景
- 六、使用示例
- 示例 1:基本使用
- 输出示例:
- 示例 2:并发使用
- 七、一个基于 `sync.Pool` 的 **Benchmark**,对比使用 `sync.Pool` 和直接创建对象的性能差异。
- Benchmark 测试代码
- 如何运行 Benchmark?
- 输出(示例)
- 结果说明
- 八、`sync.Pool` 的性能优化
- 九、注意事项
- 十、和其他复用方式比较
- 最后
sync.Pool
是 Go 标准库
sync
包中的一个数据结构,主要用于实现临时对象的池化管理。它的目的是减少频繁的内存分配和垃圾回收,提高性能,尤其在高并发场景下,避免不必要的内存分配和 GC 压力。
在日常 Go 开发中,如果你遇到频繁创建和销毁某些对象的场景,或者你在写一个高并发服务,需要有效控制内存分配和 GC 压力,那么 sync.Pool
就是你值得深入了解的工具。
一、什么是 sync.Pool
?
sync.Pool
是 Go 标准库 sync
包中的一个对象池结构,主要用于临时对象的复用,避免频繁的内存分配和回收,从而减轻垃圾回收(GC)压力,提高程序性能。
从源码可以看到核心字段如下:
type Pool struct {New func() any// 其他内部字段不对外暴露
}
通过 New
函数定义如何创建新对象,调用 Get()
取对象,Put()
放回对象。
二、sync.Pool
的基本作用
sync.Pool
允许程序池化临时对象,并在需要时提供这些对象。池中的对象通常是短期使用的对象,它们在使用后可以被重新归还给池中,以便后续复用。这种对象池机制对于避免频繁的对象创建和销毁非常有用,特别是在并发访问大量临时对象的场景中。
三、sync.Pool
的主要方法
Get()
:- 用于从池中获取一个对象。如果池中有对象,
Get()
返回一个对象。如果池中没有对象,会调用提供的New
函数来创建一个新对象(如果定义了New
)。
- 用于从池中获取一个对象。如果池中有对象,
Put()
:- 用于将一个对象放回池中,供后续复用。需要注意的是,不是所有的对象都适合放回池中,特别是那些有副作用的对象应该避免复用。
New
:sync.Pool
的New
字段是一个函数类型,可以传入一个用来生成新对象的函数。当池中没有对象时,Get()
方法会调用New
来生成一个对象。如果不需要此功能,则可以设置New
为nil
。
四、sync.Pool
的内部工作原理
sync.Pool
内部实现通常是基于一个链表,它维护了一个池中对象的集合,支持高效的插入和删除。- 该池使用了 无锁机制,即使在并发环境下,也能保证对象池的高效访问。
- 池中的对象在被
Put()
放回池中后,可以在任何时刻被重新获取,除非垃圾回收器清理了池中不再使用的对象。 - Go 的垃圾回收机制会自动回收池中未使用的对象,因此
sync.Pool
中的对象并不会长时间持有内存,避免了内存泄漏的风险。
五、sync.Pool
适用场景
sync.Pool
主要适用于以下几种场景:
- 临时对象复用(临时对象生命周期短,但创建开销大):
- 在高并发场景中,尤其是需要频繁创建和销毁对象的地方,可以使用对象池来复用临时对象,减少内存分配的开销。
- 减少垃圾回收压力(手动管理对象回收较复杂,不适合主动释放内存):
- 使用
sync.Pool
可以有效减少内存分配和垃圾回收(GC)的压力。因为池中的对象可以被重复利用,而不是频繁地创建和销毁。
- 使用
- 提高性能(高并发服务中频繁创建、销毁对象(如
[]byte
、结构体等)):- 在高并发环境下,使用池化对象可以避免频繁的内存分配和垃圾回收,提高程序的性能。
不适合:
- 对象生命周期较长
- 需要确定性回收资源(如文件句柄、数据库连接)
六、使用示例
sync.Pool
的变量复用体现:通过 Put()
放回对象,再用 Get()
获取时重用旧对象,避免了重复创建内存结构。
package mainimport ("fmt""sync"
)// 假设我们有一个临时对象类型
type MyObject struct {ID int
}func main() {// 创建一个 sync.Pool,New函数用来生成一个新的对象var pool = &sync.Pool{New: func() interface{} {// 创建一个新的 MyObject 对象return &MyObject{}},}// 从池中获取一个对象obj := pool.Get().(*MyObject)obj.ID = 42 // 使用对象// 打印对象的 IDfmt.Println("Object ID:", obj.ID)// 将对象放回池中pool.Put(obj)// 从池中获取另一个对象anotherObj := pool.Get().(*MyObject)fmt.Println("Another Object ID:", anotherObj.ID) // 此时 ID 会是0,因为是新创建的对象
}
下面以一个简单的对象池示例来演示基本用法:
示例 1:基本使用
package mainimport ("fmt""sync"
)type Buffer struct {Data []byte
}var bufferPool = sync.Pool{New: func() any {fmt.Println("New Buffer created")return &Buffer{Data: make([]byte, 0, 1024)}},
}func main() {// 从池中获取对象buf1 := bufferPool.Get().(*Buffer)buf1.Data = append(buf1.Data, []byte("Hello")...)fmt.Println("buf1:", string(buf1.Data))// 使用完后放回池中buf1.Data = buf1.Data[:0] // 重置内容bufferPool.Put(buf1)// 再次获取,复用之前的对象buf2 := bufferPool.Get().(*Buffer)fmt.Println("buf2:", string(buf2.Data))
}
输出示例:
New Buffer created
buf1: Hello
buf2:
可见第二次 Get()
没有再次创建新对象,而是复用了上一次的。
示例 2:并发使用
var intSlicePool = sync.Pool{New: func() any {return make([]int, 0, 100)},
}func worker(wg *sync.WaitGroup, id int) {defer wg.Done()s := intSlicePool.Get().([]int)s = append(s, id)fmt.Printf("Worker %d, slice: %v\n", id, s)s = s[:0] // 重置intSlicePool.Put(s)
}func main() {var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go worker(&wg, i)}wg.Wait()
}
该例子模拟了并发下的对象复用场景,可以有效减少 slice 分配。
七、一个基于 sync.Pool
的 Benchmark,对比使用 sync.Pool
和直接创建对象的性能差异。
Benchmark 测试代码
package mainimport ("bytes""sync""testing"
)type Buffer struct {Data *bytes.Buffer
}var bufferPool = sync.Pool{New: func() any {return &Buffer{Data: new(bytes.Buffer)}},
}// 不使用 sync.Pool,直接创建
func BenchmarkWithoutPool(b *testing.B) {for i := 0; i < b.N; i++ {buf := &Buffer{Data: new(bytes.Buffer)}buf.Data.WriteString("Hello World")_ = buf.Data.String()}
}// 使用 sync.Pool 重复利用
func BenchmarkWithPool(b *testing.B) {for i := 0; i < b.N; i++ {buf := bufferPool.Get().(*Buffer)buf.Data.Reset()buf.Data.WriteString("Hello World")_ = buf.Data.String()bufferPool.Put(buf)}
}
如何运行 Benchmark?
创建一个 _test.go
文件,例如 buffer_pool_test.go
,然后运行:
go test -bench=. -benchmem
输出(示例)
BenchmarkWithoutPool-10 500000 2400 ns/op 320 B/op 4 allocs/op
BenchmarkWithPool-10 1000000 1200 ns/op 0 B/op 0 allocs/op
结果说明
- ns/op:每次操作耗时,越低越好
- B/op:每次操作分配的内存字节数
- allocs/op:每次操作的内存分配次数
从示例结果可见,使用
sync.Pool
明显减少了内存分配次数和内存开销,同时也提升了执行效率。
八、sync.Pool
的性能优化
- 减少对象创建和销毁的开销:
- 在高并发环境下,频繁创建对象会导致内存分配的开销和垃圾回收压力。通过对象池化,可以减少创建和销毁对象的次数,提升性能。
- 适合临时对象的复用:
sync.Pool
更适合存储那些生命周期较短、频繁创建和销毁的对象,避免了过多的内存分配和垃圾回收操作。
- 避免对象泄漏:
- 如果池中对象不再被使用(例如被 GC 清理),它们将被自动删除,避免了内存泄漏的问题。
九、注意事项
- 避免放入重负载的对象:
- 一些资源密集型的对象,如数据库连接或文件句柄,应该避免放入
sync.Pool
,因为它们通常不适合复用,并且会导致不可预见的副作用。
- 一些资源密集型的对象,如数据库连接或文件句柄,应该避免放入
- 不应对同一对象进行多次
Put()
:Put()
应该用于将一个对象放回池中以供后续复用。如果将同一对象多次放入池中,可能会导致不可预料的行为。
- GC 清理:
- 在 Go 的垃圾回收机制中,池中的对象有时会被 GC 回收。如果池中的对象不再使用,
sync.Pool
会自动清理它们。
- 在 Go 的垃圾回收机制中,池中的对象有时会被 GC 回收。如果池中的对象不再使用,
- 适合临时对象复用
- 比如用于解码、缓冲处理、临时排序等。
- 不要指望 Pool 实现跨协程稳定复用
sync.Pool
更像是对当前 goroutine 或 CPU 本地缓存的一种优化,跨核心复用的能力有限。
十、和其他复用方式比较
方法 | 优点 | 缺点 |
---|---|---|
sync.Pool | 简单、线程安全、自动 GC 清理 | 控制不精确、不可预测回收 |
自定义对象池(channel) | 更可控,可限制最大数量 | 实现复杂、需要额外锁 |
手动复用(重用结构体) | 内存利用最大化 | 需要明确回收点,编码难度高 |
最后
sync.Pool
是一个非常有用的工具,特别适用于高并发场景中对象的复用,减少内存分配和垃圾回收的开销。它通过对象池化机制,使得临时对象能够被高效地复用,进而提高程序的性能。在使用时,应避免将那些不适合复用或者资源密集型的对象放入池中。
临时对象复用优先用
sync.Pool
,长生命周期或资源敏感场景慎用。
相关文章:
[每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器
文章目录 一、什么是 sync.Pool?二、sync.Pool 的基本作用三、sync.Pool 的主要方法四、sync.Pool 的内部工作原理五、sync.Pool 适用场景六、使用示例示例 1:基本使用输出示例:示例 2:并发使用 七、一个基于 sync.Pool 的 **Benc…...
Prompt-Tuning 提示词微调
1. Hard Prompt 定义: Hard prompt 是一种更为具体和明确的提示,要求模型按照给定的信息生成精确的结果,通常用于需要模型提供准确答案的任务. 原理: Prompt Tuning原理如下图所示:冻结主模型全部参数,在…...
sqli-labs之Less-7 GET注入写shell
验证注入点:单引号报错,)) 根据提示,是想让我们试试写shell 第一个条件 secure_file_priv 写shell即MySQL需要对外写文件,但默认MySQL是不允许outfile来导出数据的,先动手在MySQL确认一下。 MySQL特性,se…...
数据库基础-B+树
查询类型 全表扫描,不提供索引,扫描所有集合中的数据。根据指定key值查询指定点范围查询,在指定区间内查询 有很多方法能够进行快速扫面数据,但是再快复杂度也是O(N),我们的目标是想办法将查询复杂度降低到O(logN)。…...
智能语音备忘录:SpeechRecognition与gTTS的奇妙融合
引言:智能语音备忘录的时代已经到来 在这个信息爆炸的时代,我们每天需要处理大量的事务和信息。传统的文字记录方式虽然可靠,但在效率上往往难以满足快节奏生活的需求。想象一下,如果你能在驾车、散步或是灵感突现的任何时刻&…...
C++项目 —— 基于多设计模式下的同步异步日志系统(3)(日志器类)
C项目 —— 基于多设计模式下的同步&异步日志系统(3)(日志器类) 整体思想设计日志消息的构造C语言式的不定参函数的作用函数的具体实现逻辑1. 日志等级检查2. 初始化可变参数列表3. 格式化日志消息4. 释放参数列表5. 序列化和…...
2025/4/19 数据库的流程控制函数
单行函数_流程函数 要点: 流程处理函数可以根据不同的条件 执行不同的处理流程 可以在SQL语句中实现不同的条件选择,MySQL中的流程处理函数主要包括if() ifnull() 和 case() 函数 多行函数_聚合函数 和单行函数的区别: 单行函数是作用在每一行 最终结果可能是多行结果 多行…...
代码随想录打家劫舍+树形DP入门
动态规划part07 198.打家劫舍 视频讲解:https://www.bilibili.com/video/BV1Te411N7SX https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html dp数组:进入房屋i能够偷得得最大金额dp[i]递推公式:根据不相邻原则…...
Http基础
目录 定义 一、请求部分(Request) 1. 请求行(Request Line) 常见请求方法: 2. 请求头(Request Headers) 3. 请求体(Request Body) 二、响应部分(Respo…...
【Unity】bug记录——部分物体突然不受animator控制
博主烘焙完灯光后突然发现有的物体的动画失效了,不会动,测试发现是因为勾了static(但是有些勾了static的物体就没事),修改static为Contribute GI Static(只针对光照静态)就行...
Zephyr、FreeRTOS、RT-Thread 邮箱(Mailbox)对比分析
一、核心特性对比 特性ZephyrFreeRTOSRT-Thread消息类型支持指针或4字节数据(依赖架构)仅支持指针传递支持任意数据类型(需指定消息长度)容量固定容量(静态初始化配置)动态容量(基于队列长度&a…...
xilinx fpga中pll与mmcm的区别
Xilinx中的PLL(锁相环)和MMCM(混合模式时钟管理器)都是用于时钟管理的关键组件,但它们之间存在一些显著的区别。以下是对两者的详细比较: 1. 功能特性 PLL(锁相环): 主…...
Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验
上一期小练习解答(第7期回顾) ✅ 练习1:找出1~100中能被3或5整除的数 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]✅ 练习2:生成字符串长度字典 words ["apple", "banana", "grape…...
黑马商城(五)微服务保护和分布式事务
一、雪崩问题 二、雪崩-解决方案(服务保护方案) 请求限流: 线程隔离: 服务熔断: 服务保护组件: 三、Sentinel 引入依赖: <!--sentinel--> <dependency><groupId>com.aliba…...
Java 编译与反编译深度解析
Java 编译与反编译深度解析 1. 编译过程详解 (1) 完整编译流程 .java 文件 → 词法分析 → 语法分析 → 语义分析 → 字节码生成 → .class 文件│ │ │ │↓ ↓ ↓ ↓识别关键字 生成抽象语法树 类型…...
Java集合框架中的List、Map、Set详解
在Java开发中,集合框架是处理数据时不可或缺的工具之一。今天,我们来深入了解一下Java集合框架中的List、Map和Set,并探讨它们的常见方法操作。 目录 一、List集合 1.1 List集合介绍 1.2 List集合的常见方法 添加元素 获取元素 修改元素…...
国产的 Java Solon v3.2.0 发布(央企信创的优选)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目ÿ…...
机器学习决策树
一、何为决策树 决策树(Decision Tree)是一种分类和回归方法,是基于各种情况发生的所需条件构成决策树,以实现期望最大化的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。它的运行机制非常通俗易…...
Java集合及面试题学习
知识来源沉默王二、小林coding、javaguide 1、ArrayList list.add("66") list.get(2) list.remove(1) list.set(1,"55") List<String> listnew ArrayList<>(); 底层是动态数组 添加元素流程:判断是否扩容…...
【内置函数】84个Python内置函数全整理
Python 内置函数全集(完整分类 参数详解 示例) 文章目录 Python 内置函数全集(完整分类 参数详解 示例)一、数值与数学函数abs(x)divmod(a, b)pow(x, y, modNone)round(number[, ndigits])sum(iterable, /, start0)hash(obj) …...
【LeetCode 热题 100】双指针 系列
📁283. 移动零 对于该题目,需要注意的是两个地方,一是保持非零元素的相对顺序,以及O(1)的空间复杂度。 采用双指针的思路,将数组划分成3个区间,。 [0 , left]:该区间内元素全是非零元素。 [left1 , right…...
实现批量图片文字识别(python+flask+EasyOCR)
话不多说,向上效果图 1)先说框架版本 为什么要先说框架版本呢,因为我在各种版本中尝试了两天,总算确定了如下版本适合我,至于其他的版本,各位自己去尝试 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)执行操作效果图 2.1)多选文件 2.2)图片预览 2.3)提取选中文件 2.4)提取所有文…...
[Swift]pod install成功后运行项目报错问题error: Sandbox: bash(84760) deny(1)
操作: platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后运行报错 报错: error: Sandbox: bash(84760) deny(1) file-writ…...
文档内容提取以及合成
如何从10个左右的docx文档中抽取内容,生成新的文档,抽取内容包括源文档的文字内容、图片、表格、公式等,以及目标文档的样式排版、字体、格式,还有目标文档的语言风格、用词规范、文法习惯等等。这是一个相当复杂的需求࿰…...
[Windows] Wireshark 网络抓包工具 v4.4.6
[Windows] Wireshark 网络抓包工具 链接:https://pan.xunlei.com/s/VOODTZ7Lm2gsNLoFNcOIqflzA1?pwdf3ea# 软件说明Wireshark(前称Ethereal)是一款免费开源的网络嗅探抓包东西,世界上最流行的网络协议剖析器!网络封…...
在Ubuntu中安装hadoop的详细过程
在Ubuntu中安装hadoop的详细过程 请自行安装Ubuntu系统(可参考:在VMWare中安装Linux虚拟机Ubuntu) 一、创建hadoop用户 如果在安装 Ubuntu 的时候不是用的 “hadoop” 用户,这时需要增加一个名为 hadoop 的用户。 首先打开终端…...
NOIP2017提高组.列队
目录 *数据结构模板题目算法标签: 模拟, 线段树, 线段树动态开点, 树状数组, 平衡树思路*前置代码完整注释代码精简注释代码 *数据结构模板 题目 530. 列队 算法标签: 模拟, 线段树, 线段树动态开点, 树状数组, 平衡树 思路 首先考虑简单情况, 如果只有一行, 删除一个位置…...
PSN港服跳过生日找回密码(需要英语对话,需要注册的id)
登陆这个网站 https://www.playstation.com/en-hk/support/contact-us/?categoryAcc&subCategorypw 随便输入点名字 firstname 跟lastname 勾选,然后打开机器人聊天 然后按照提示输入邮箱跟id,输入正确之后会分配真人客服 真人客服会要求提供第一次…...
服务治理-服务注册
一个服务在真实项目部署的时候,如果压力较大,会做多实例部署。 在IDEA里面做多实例部署的话,只需要配置多个启动项。...
Jinja2模板引擎SSTI漏洞
1. 引入 再研究大模型相关应用的漏洞CVE-2025-25362时(参考1),看到作者给了比较详细的分析(参考2)。下面对这个漏洞做个介绍。 2. 漏洞类型 这个漏洞属于CWE-1336,它主要关注在使用模板引擎进行脚本化处…...
STM32单片机教程:从零开始打造智能天气时钟
STM32单片机教程:从零开始打造智能天气时钟 大家好!今天我想为大家详细介绍一下我们的STM32课程,以及如何从零基础逐步掌握单片机开发技能,最终实现一个完整的智能天气时钟项目。 课程面向人群 本课程主要面向那些已经通过野火…...
c++_csp-j算法 (1)
DFS搜索(深度优先搜索) 讲解 第一部分:DFS搜索算法简介 深度优先搜索(Depth-First Search,DFS)是一种常用的图搜索算法,用于遍历或搜索图或树的所有节点。DFS算法的核心思想是尽可能深地搜索图的分支,直…...
word选中所有的表格——宏
Sub 选中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…...
16、堆基础知识点和priority_queue的模拟实现
一、priority_queue的使用方法 priority_queue的使用方法看这篇文章 二、堆 1、介绍 堆(Heap)是一种特殊的完全二叉树数据结构,满足以下性质: 堆序性质(Heap Property): 大顶堆(…...
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤 2025/4/19 15:38 查询格式YUV/RGB 81 09 04 24 60 FF 90 50 00 00 FF 查询辨率帧率 81 09 04 24 72 FF 90 50 01 03 FF 查询LVDS mode : Singel output/Dual output 81 09 04 24 74 FF 90 50 00 00 FF 配置405的机…...
【信息系统项目管理师】高分论文:论信息系统项目的采购管理(信息化办公系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划采购管理2、实施采购3、管理采购论文 随着信息化技术的发展,从企业到政府,传统的办公模式正在悄然消失,信息化办公模式正成为主流。特别是国务院印发的《关于加快推广“互联网+政务服务”工作的…...
国产GPU生态现状评估:从寒武纪到壁仞的编程适配挑战
近年来,国产GPU厂商在硬件性能上持续突破,但软件生态的构建仍面临严峻挑战。本文以寒武纪、壁仞等代表性企业为例,对比分析其与CUDA生态的兼容性差异,并探讨技术突围路径。 一、编程适配的核心挑战 编程模型差异与开发成本 …...
Linux(autoDL云服务器)mamba-ssm环境安装——一次成功!
1.创建环境选择torch2.0, cuda11.8,python3.8 2.从GitHub官网下载cp38对应的,causl_conv1d,和mamba-ssm2.2.2。下载入下图所示。 3.直接用finalshell 或者xshell连接服务器上传,到根目录下面。 直接用pip install *…...
手搓LeNet-5(基础模型)实现交通标志识别
手搓LeNet-5(基础模型)实现交通标志识别 一、环境准备1. 安装Python环境2. 安装CUDA(可选,仅需GPU加速时)3. 配置虚拟环境4. 安装PyTorch核心库5. 安装辅助库6. 验证安装7. 准备数据集8.常见问题处理 二、 数据集处理三…...
TV主板的拆解学习
下面是小米的电视机主板,电源采用PFCLLC方案,主控采用电视盒子主控采用晶晨半导体T962-H,搭配2G南亚DDR3L内存和8G三星eMMC存储器。 本文用来加深对TV主板的认识,学习于充电头网,链接在文末。 两颗蓝色插件Y电容来自S…...
PH热榜 | 2025-04-19
1. Omakase.ai Voice 标语:你的语音驱动销售助手。一个链接。 介绍:Omakase.ai Voice将您的网站转变为一个语音驱动的销售助手,它可以在客户浏览时进行对话、倾听并给出推荐。聊天机器人往往效果不佳——它们无法实现销售,而这个…...
LeetCode(Hot.2)—— 49.字符异位词分组题解
Problem: 49. 字母异位词分组 字母异位词的定义是:两个单词的字母组成一样,但顺序可以不同,比如 eat、tea 和 ate 就是一个组的。 思路 将每个字符串按字母排序,把排序后的字符串作为 key,相同 key 的放在一个 list 中…...
UE学习记录part19
231 insect: insect enemy type 创建dead动画资源 往insect head上添加socket 创建攻击root motion动画。motion warping需要与root motion合作使用 为buff_blue创建物理资产 设置simulate physic使sinsect死亡后能落到地板上而不是漂浮在空中,要将die函数设置为 -…...
不连续数据区间天数累计sql
计算不连续数据区间天数并且剔除重复天数 create table loan_data(loan_no varchar(10),cust_no varchar(10),start_date date,end_date date )INSERT INTO loan_data VALUES (LN001, CUST001, 2025-01-04, 2025-01-08); INSERT INTO loan_data VALUES (LN002, CUST001, 2025-…...
django基于爬虫的网络新闻分析系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本网络新闻分析系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。前台主要功能包括:用户注册、登录、浏览…...
JAVA文件I/O
目录 一、三种路径的分类: 1、绝对路径: 2、相对路径: 3、基准目录: 二、文件的种类: 三、利用JAVA操作文件: 1、File类的构造方法: 2、File 类方法的使用: 使用例子&#…...
第七周作业
一、分别在前端和后端使用联合注入实现“库名-表名-字段名-数据”的注入过程,写清楚注入步骤 1、爆库 后端sql语句:select database(); 前端:1 order by 1#,1 order by 2#,1 order by 3# 判断显示位为两位1 union sel…...
Linux 进程信号详解
进程信号 信号是进程之间事件异步通知的一种方式,属于软中断。 kill -l //查看不同信号代表的事件 执行kill -l 可以看到共有62种信号,其中: 0-31号信号为非可靠信号(这部分信号借鉴于UNIX系统的信号);…...
MCP 应用案例-网络设备批量管理
案例背景 需求痛点 企业需管理数百台跨地域网络设备(交换机/路由器),传统方式存在: 人工SSH登录效率低脚本维护成本高(不同厂商CLI语法差异)状态监控依赖独立监控系统 解决方案 通过MCP协议构建智能网络…...
进程程序替换
fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序 替换来完成这个功能! 程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!…...