闭包与装饰器(python)
此 Python 代码借助闭包构建了计算对数的函数。闭包指的是一个函数与其所引用的外部变量共同构成的一个整体。借助闭包,我们能够创建具有特定行为的函数,并且这些函数可以记住其创建时的环境。
代码详细分析
导入模块
python
import math
导入 math
模块,它是 Python 的标准库,提供了众多数学相关的函数,这里主要使用其中的 log
函数来计算对数。
定义外层函数 logFun
python
def logFun(base):
这是外层函数,它接收一个参数 base
,该参数代表对数的底数。
定义内层函数 inner_fun
python
def inner_fun(x):return math.log(x, base)
inner_fun
是定义在 logFun
内部的函数,它接收一个参数 x
,代表对数的真数。math.log(x, base)
会计算以 base
为底 x
的对数。要注意的是,base
并非在 inner_fun
内部定义,而是从外部的 logFun
函数获取,这就形成了闭包。
返回内层函数
python
return inner_fun
logFun
函数返回 inner_fun
函数对象。这样一来,调用 logFun
时会得到一个函数,这个函数记住了 base
的值。
创建闭包实例
python
log2 = logFun(2)
log10 = logFun(10)
logFun(2)
调用logFun
函数,传入参数2
,返回一个闭包函数。这个闭包函数会记住底数为2
,并将其赋值给log2
。logFun(10)
同理,传入参数10
,返回的闭包函数记住底数为10
,并赋值给log10
。
断言验证结果
python
assert abs(log2(2) - 1) < 1e-8
assert abs(log10(10) - 1) < 1e-8
这两行代码属于断言语句,用于验证计算结果是否符合预期。下面详细解释:
log2(2)
:调用log2
这个闭包函数,传入参数2
。由于log2
记住的底数是2
,所以log2(2)
计算的是以2
为底2
的对数,理论上结果为1
。abs(log2(2) - 1)
:abs
是 Python 的内置函数,用于计算绝对值。这里计算log2(2)
的结果与1
的差值的绝对值。< 1e-8
:1e-8
表示1
乘以10
的负8
次方,也就是0.00000001
。由于浮点数在计算机中的表示存在精度问题,所以不直接判断log2(2)
是否等于1
,而是判断它们的差值的绝对值是否小于一个极小的数1e-8
。如果小于这个数,就认为计算结果是正确的。assert
语句:assert
语句用于调试和验证代码。如果assert
后面的条件为True
,程序会继续执行;如果为False
,程序会抛出AssertionError
异常。
同理,assert abs(log10(10) - 1) < 1e-8
验证的是以 10
为底 10
的对数是否接近 1
。
代码原理剖析
- 装饰器函数
makeBold
-
def makeBold(fun):
定义了一个名为makeBold
的装饰器函数,它接受一个函数fun
作为参数 。这是装饰器的典型特征,将被装饰的函数当作参数传入。- 内部嵌套函数
wrapper
:
-
-
def wrapper():
定义了内部的wrapper
函数。在装饰器逻辑中,wrapper
函数起到包装的作用。return '<b>' + fun() + '</b>'
这行代码调用传入的fun
函数(也就是被装饰的函数),并将其返回值用<b>
和</b>
标签包裹起来。这里<b>
是HTML标签,用于表示加粗显示。return wrapper
:makeBold
函数最后返回wrapper
函数对象。这意味着,当makeBold
装饰某个函数时,实际上返回的是这个wrapper
函数,后续调用被装饰函数时,执行的就是wrapper
函数的逻辑。
-
- 被装饰函数
hello
-
@makeBold
是装饰器语法糖,等同于hello = makeBold(hello)
。它的作用是将makeBold
装饰器应用到hello
函数上。def hello():
定义了hello
函数,它原本的功能是返回字符串'Hello world!'
。
- 函数调用
-
print hello()
:在装饰器作用下,调用hello
函数时,实际执行的是makeBold
函数中wrapper
函数的逻辑。wrapper
函数先调用原始的hello
函数获取返回值'Hello world!'
,然后将其用<b>
和</b>
标签包裹,最终返回<b>Hello world!</b>
并打印输出。
装饰器总结
装饰器本质上是利用闭包特性。makeBold
函数中的 wrapper
函数记住了传入的 fun
函数(形成闭包),并且在 wrapper
函数被调用时执行额外的逻辑(这里是添加HTML加粗标签),从而在不修改原函数代码的基础上,增强了函数的功能。
首先看左边的代码,没有使用 functools.wraps。左边定义了 makeTag 装饰器,然后用 @makeTag ('p') 和 @makeTag ('b') 装饰 hello 函数。装饰器的运行过程是怎样的呢?
先看左边的 makeTag 函数。def makeTag (tag): 这个函数接收 tag 参数,返回 inner_decorator。inner_decorator 接收 fun 参数,返回 wrapper。wrapper 函数把 fun 的返回值用 tag 标签包裹。当使用两个装饰器时,@makeTag ('p') 和 @makeTag ('b'),相当于 hello = makeTag ('p')(makeTag ('b')(hello))。先执行 makeTag ('b')(hello),得到一个 wrapper 函数,然后再用 makeTag ('p') 装饰这个 wrapper,又得到一个新的 wrapper。这样,原来的 hello 函数就被替换成最外层的 wrapper 了。所以当打印 hello.__name__时,就会显示 wrapper,__doc__也变成 None,因为原函数的属性丢失了。
再看右边的代码,使用了 functools.wraps。右边的 makeTag 装饰器在 wrapper 函数上用了 @functools.wraps (fun),这会把原函数 fun 的属性复制给 wrapper。同样是 @makeTag ('p') 和 @makeTag ('b') 装饰 hello 函数,过程类似,但因为 wraps 的作用,wrapper 继承了原 hello 函数的属性。所以打印 hello.__name__时还是 hello,__doc__也能显示原来的函数说明。
图中展示了两组代码,分别演示了带参数装饰器在使用和不使用 functools.wraps
时的不同效果,以下是对两组代码中函数运行过程的详细介绍:
左侧代码(未使用 functools.wraps
)
- 定义装饰器
makeTag
:
-
def makeTag(tag):
:定义一个接收标签参数tag
的函数,返回内部装饰器inner_decorator
。def inner_decorator(fun):
:接收被装饰的目标函数fun
(如hello
),返回包裹函数wrapper
。def wrapper(*args, **kwargs):
:使用tag
为fun(*args, **kwargs)
的返回值添加标签(如<tag>... </tag>
),最后返回包装后的结果。此时,wrapper
函数完全替代了原hello
函数。
- 装饰与调用
hello
函数:
-
@makeTag('p') @makeTag('b')
:等价于hello = makeTag('p')(makeTag('b')(hello))
。先执行makeTag('b')(hello)
,生成一个用<b>...</b>
包裹的wrapper
;再执行makeTag('p')
装饰该wrapper
,生成新的用<p>...</p>
包裹的wrapper
。最终,hello
函数被替换为最外层的wrapper
。print(hello.__name__)
:输出wrapper
(原hello
函数名丢失,被wrapper
替代)。print(hello.__doc__)
:输出None
(原hello
的文档字符串丢失)。
右侧代码(使用 functools.wraps
)
- 定义装饰器
makeTag
:
-
import functools
:引入模块以使用wraps
。def makeTag(tag):
:同样接收标签参数tag
,返回inner_decorator
。def inner_decorator(fun):
:接收目标函数fun
,但通过@functools.wraps(fun)
将fun
的属性(如__name__
、__doc__
)复制给wrapper
。def wrapper(*args, **kwargs):
:与左侧逻辑相同,用tag
标签包裹fun
的返回值,但因wraps
的作用,wrapper
继承了fun
的属性。
- 装饰与调用
hello
函数:
-
@makeTag('p') @makeTag('b')
:同样等价于hello = makeTag('p')(makeTag('b')(hello))
,装饰过程与左侧一致,但由于@functools.wraps(fun)
的存在:print(hello.__name__)
:输出hello
(保留原函数名)。print(hello.__doc__)
:输出这里是函数说明
(保留原函数文档字符串)。
总结
- 装饰器逻辑:两组代码中,装饰器均通过多层嵌套实现标签叠加(先
b
标签,再p
标签)。 - 属性保留:左侧因未使用
functools.wraps
,原hello
函数属性被覆盖;右侧通过@functools.wraps(fun)
保留了原函数属性,使hello
的__name__
和__doc__
正常显示。
具体步骤:左边,装饰器替换函数后,属性丢失;右边,通过 wraps 保留属性。两个装饰器的调用顺序都是从里到外,先处理 @makeTag ('b'),再处理 @makeTag ('p')。每个装饰器都会生成一个 wrapper,左边的 wrapper 没有保留原函数属性,右边的保留了。
记录调用时间,不改变现有代码,用装饰器打印日志,记录时间。
相关文章:
闭包与装饰器(python)
此 Python 代码借助闭包构建了计算对数的函数。闭包指的是一个函数与其所引用的外部变量共同构成的一个整体。借助闭包,我们能够创建具有特定行为的函数,并且这些函数可以记住其创建时的环境。 代码详细分析 导入模块 python import math 导入 math …...
学成在线网页
技术:h5css,静态页面 主页: 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...
AI测试工具Testim——告别自动化测试维护难题
随着人工智能技术的快速发展,AI测试工具正在成为提升软件研发效能的关键。每款AI的特性各有差异,今天,我们就给大家介绍一款专注于Web和移动应用的端到端的AI测试工具--Testim。 Testim的简介 官网地址:https://www.testim.io/ 简…...
【C++详解】C++入门(二)引用、内联函数、nullptr宏
文章目录 一、引用引用的概念和定义引用的功能引用的特性const引用const用法回顾权限的放大缩小const引用的功能 指针和引用的关系 二、内联函数三、nullptr补充结构体指针变量类型重定义 一、引用 引用的概念和定义 C祖师爷为了优化在部分场景中使用指针会出现的效率较低和比…...
8、HTTPD服务--CGI机制
目录 1、测试PHP页面 2、安装php软件 一、CGI机制介绍 1、测试PHP页面 [rootlocalhost ~]# cat /mp3/test1.php AAAAAAAAAAAAA <?phpphpinfo(); ?> 2、安装php软件 # yum install -y php # systemctl restart httpd php实际上是作为httpd的功能模块存在的 [r…...
层级时间轮的 Golang 实现原理与实践
一、引言 在高并发服务中,延时任务的管理是一个常见且重要的需求。比如 HTTP 请求超时、心跳检测、订单超时未支付提醒等场景,传统的 Timer 或 Heap 实现会带来 O(log n) 的复杂度,难以支撑百万级别的定时任务。 论文《Hashed and Hierarch…...
人类社会的第四阶段
本书的主旨是探讨一场新的权力革命,它将以20世纪民族国家的毁灭为代价, 解放出个体。创新,以前所未有的方式改变了暴力的逻辑,并且正在革新未来的 边界。如果我们的推论是正确的,你们正站在一场有史以来最宏大的革命的…...
Golang | Builder模式
Builder模式是一种创建型设计模式,用于分步骤构建复杂对象,尤其适用于构造过程复杂或需要多个配置选项的场景。将对象的构造过程与其表示分离,通过分步骤和链式调用的方式灵活创建对象,避免构造函数的参数爆炸,提升代码…...
C#本地使用离线ocr库识别图片中文本,工具包PaddleOCRSharp
C#本地使用离线ocr库识别图片文本,工具包PaddleOCRSharp PaddleOCRSharp介绍 项目地址:https://github.com/raoyutian/PaddleOCRSharp PaddleOCRSharp 是一个.NET版本OCR可离线使用类库。项目核心组件PaddleOCR.dll目前已经支持C\C、.NET、Python、Go…...
Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素
近日,在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法,该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对,简化显式检查 null 的场景: /之前 var listWithoutNullAwareElements [if …...
3、Linux操作系统下,linux的技术手册使用(man)
linux系统内置技术手册,方便开发人员查阅Linux相关指令,提升开发效率 man即是manual的前三个字母,有时候遇事不决,问个人(man) 其在线网址为:man 还有man网站的作者写的书,可以下…...
Python 自动化办公:Excel 数据处理的“秘密武器”
引言 在日常的 IT 办公场景里,Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩,还是运营人员分析用户数据,Excel 都发挥着关键作用。但面对海量数据,手动操作 Excel 不仅效率低下,还…...
通过数据增强打造抗噪音多模态大模型
下载前面 想象一下,你正在一个嘈杂的咖啡馆里,想让身边的AI助手帮你预定一张电影票。或者,你在熙熙攘攘的街道上,需要语音导航带你找到目的地。在这些真实的场景中,语音交互面临着一个巨大的挑战——噪音。 背景噪音、他人说话声、设备本身的电流声……这些无处不在的干…...
Node.js API 安全的主要策略:最佳实践
了解 Node.js API 安全性 保护 Node.js API 的安全需要了解潜在的漏洞并采取措施来缓解这些漏洞。这类 API 通常遇到的常见威胁包括: SQL 注入**:**操纵用户输入以针对数据库执行恶意 SQL 代码。跨站点脚本**(XSS):**将恶意脚本注入其他用户查看的网页。跨站请求伪造**(CSR…...
如何删除Google Chrome中的所有历史记录【一键清除】
谷歌浏览器记录了用户访问过的网站。这方便了查找,但有时也需要清理。删除所有历史记录很简单,只要按照以下步骤操作。 1. 打开谷歌浏览器 首先要启动谷歌浏览器。点击右上角的三个点,进入主菜单。 2. 进入历史记录界面 在菜单中找到“历史…...
计算机三大主流操作系统的前世今生 - Linux|macOS|Windows
全文目录 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 综合解析3.1 Linux系统综合解析3.1.1 系统定义与核心架构3.1.2 发展历程3.1.3 核心特点3.1.4 主流发行版3.1.5 应用场景 3.2 macOS系统综合解析3.2.1 系统定义与核心架构3.2.2 发展历程3.2.3 核心特点…...
大数据学习栈记——Hive4.0.1安装
本文介绍大数据技术中数据仓库Hive的安装配置,版本:Hive4.0.1,Ubuntu24.04。 Hive简介 Hive由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据…...
8.Excel:数据验证和下拉列表
一 数据验证 1.作用 限制用户输入单元格的值。 补充:数据验证要先设置验证才会起作用,对于已经填写完成的表格来说,可以快速找到不符合的数值。 选中整列,然后设置数据验证。 然后圈释无效数据,不符合的会被圈出来 2.如…...
【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用
在机器学习的世界里,线性回归就像是一把瑞士军刀——简单却功能强大。无论是预测房价、分析销售趋势,还是研究变量间的相关性,线性回归都是数据科学家首选的入门算法。但你是否曾好奇过,这个看似简单的算法背后,是如何…...
《代码整洁之道》全书归纳
如果要把这本书最关键、最核心、被反复提及和强调的重点提炼出来,那就是: 可读性高于一切: 你的代码是给人读的,让它像一篇清晰的文章一样易于理解。表达意图是关键。短小、单一: 函数要短小,类要短小&…...
项目代码生成工具
代码生成工具 文章目录 代码生成工具提取公共类domainbodtoentityvoBean基类 代码生成工厂连接配置模版1、基础类基类Entity添加DTO类分页查询DTO基础查询DTO修改DTO视图VO 2、controller2、service接口3、service实现类4、Mapper接口5、Mapper的xml文件 提取公共类 比方说每个…...
【机器学习驱动的智能化电池管理技术与应用】
在人工智能与电池管理技术融合的背景下,电池科技的研究和应用正迅速发展,创新解决方案层出不穷。从电池性能的精确评估到复杂电池系统的智能监控,从数据驱动的故障诊断到电池寿命的预测优化,人工智能技术正以其强大的数据处理能力…...
【MySQL 】MySQL 安装自记录全程-详细 (mysql-installer-community-8.0.42.0.msi)
看了一些别人的文章,其实还有些困惑,根据不少都有一些跟我遇到的不太一样,记录一下自己的安装过程 MySQL 安装(Windows) 下载 MySQL 安装包 MySQL数据库官网链接 MySQL (MySQL的https://www.mysql.com/ …...
构建事件驱动的云原生后端系统 —— 从设计到实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么需要事件驱动架构? 在现代互联网应用中,系统规模越来越大,功能模块越来越复杂,用户行为越来越不可预测。 传统的同步调用、强耦合的后端架构,面对大规模并发、高频变化、复杂交…...
时间复杂度和空间复杂度 [数据结构 初阶]
目录 算法效率 1. 时间复杂度 1.1 时间复杂度概念 1.2 大O 的渐进表示法 1.2.1 计算 func1 的基本操作执行了多少次 1.3 推导 大O 阶方法 2. 空间复杂度 算法效率 // 算法效率分析分为两种: 1) 时间效率: 时间复杂度, 用来衡量一个算法的运行速度; 2) 空间效率: 空间复…...
SpringMVC 通过ajax 前后端数据交互
在前端的开发过程中,经常在html页面通过ajax进行前后端数据的交互,SpringMVC的controller进行数据的接收,但是有的时候后端会出现数据无法接收到的情况,这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景&#x…...
Qt从零开始(1)了解
文章目录 1. Qt技术介绍2. 开发GUI的选择3. 框架的介绍4.Qt发展历程(简单介绍)5. Qt支持的系统6. Qt开发方式7.Qt优点总结 简介:这篇文章简单介绍下Qt的相关知识与应用场景,随便看看,了解了解即可。如果介绍有误或者描…...
当元数据遇见 AI 运维:智能诊断企业数据资产健康度
在数字化浪潮席卷全球的当下,企业数据资产规模呈指数级增长,然而传统数据监控方式却逐渐暴露出诸多弊端。想象一下,在某头部电商的晨会上,数据工程师小王正经历职业生涯最尴尬的时刻:“昨天促销活动的 UV 数据为什么比…...
关于OCP认证:有Oracle和MySQL两种
认证针对的数据库系统 MySQL OCP:是 Oracle 公司针对 MySQL 数据库管理员和开发者设计的认证,主要验证持证者在 MySQL 数据库管理、优化及安全等方面的技术能力。MySQL 是开源的关系数据库管理系统,以其简单、高性能和灵活性在中小型企业及开…...
Macos m系列芯片环境下python3安装mysqlclient系列问题
最近学习python3,在安装mysqlclient的时候遇到了一些问题,直接使用哦pip install mysqlclient 直接报错了,记录一下解决方案。 环境信息 设备:Macbook Pro m1 系统:macos Sequoia 15.3.2 最终成功的python版本…...
《代码整洁之道》第7章 错误处理 - 笔记
得墨忒耳定律 不要链式调用, 如 a.getB().getC().doSomething()。 直接获取对象调用方法 数据传输对象(DTOs) DTO (Data Transfer Object): 数据传输对象。这是一种典型的数据结构。 里面没有任何业务逻辑代码。它的唯一作用就…...
java-mybatis01
对象/关系映射ORM ORM完成面向对象的编程语言DAO关系数据库的映射后,开发人员可以利用面向对象设计语言的建议易用性,也可利用关系数据库的技术优势。 ORM把关系数据库包装成面向对象的模型,采用ORM框架后,应用程序不再直接访问底…...
单片机之间的双向通信
具体功能实现 甲单片机通过按键可以控制乙单片机的LED灯,而乙单片机通过可以让连接甲单片机的数码管数字自增加一。 定时器资源 3个定时器 中断系统 执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,cpu暂时中止现行程序&…...
量子纠缠式架构:当微服务同时存在于所有节点时,CAP定理是否依然成立?
一、CAP定理的经典困境 1. 传统分布式系统的三维束缚 经典权衡案例: 系统类型选择代价银行核心系统CP故障时拒绝服务社交网络AP短暂数据不一致物联网平台CA网络中断即崩溃 二、量子纠缠的降维打击 1. 量子微服务的超距同步 # 量子纠缠服务示例(Qiski…...
使用rsync和inotidy-tools来进行实时备份文件夹数据
在工作中遇到这个这么个需求,就是我们有一个samba的文件共享服务器,里面存了很多文件,然后我想实时备份这个samba共享文件的。 1、概述 只需要在源服务器上操作,并在源服务器上安装好rsync和inotidy-tools,目标服务器…...
Spring AI 实现智能对话
1. 实现效果 2. Spring Boot 3 后端 2.1 pom.xml <!-- 管理包依赖。通过 Spring AI 的 BOM 文件统一管理所有 Spring AI 相关依赖的版本,确保版本一致性,减少冲突 --><dependencyManagement><dependencies><!-- Spring AI -->…...
2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁
引言:当攻击成本趋近于零,防御逻辑必须重构 2025 年,网络安全领域正经历三重根本性变革: 攻击者门槛坍缩:生成式 AI 将网络钓鱼开发效率提升 300%,勒索软件即服务(RaaS)订阅用户突破…...
学习笔记—双指针算法—移动零
双指针算法 移动零 283. 移动零 - 力扣(LeetCode) 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进…...
计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)
计算机网络作为现代信息技术的基石,支撑着互联网、物联网、云计算等众多领域的发展。无论是前端开发者、后端工程师,还是运维人员,深入理解计算机网络原理都至关重要。本文将从网络分层模型出发,逐步深入讲解 TCP/UDP 协议、Socke…...
IP地址如何切换到国内别的省份?一步步指导
使用换IP工具的主要目的是通过更换设备的公网IP地址来满足特定需求,例如绕过限制、保护隐私或完成特定任务。以下是常见的应用场景和原因: 一、ip应用场景 1. 绕过IP限制 访问地域限制内容:某些网站或服务(如游戏、社交平台 &am…...
c++流对象
核心概念回顾: C 的流库 (<iostream>, <fstream>, <sstream>) 提供了一种统一的方式来处理输入和输出,无论数据是来自键盘、文件还是内存中的字符串。它们都基于 std::istream (输入流基类) 和 std::ostream (输出流基类),…...
华为IP(5)
交换机的堆叠与集群 堆叠和集群指的是同一件事 前言: 随着企业的发展,企业网络的规模越来越大,这对企业网络提出了更高的要求:更高的可靠性、更低的故障恢复时间、设备更加易于管理等。 传统的园区网高可靠性技术出现故障时很难做到毫秒级…...
零信任架构下的等保 2.0 与密评密改双合规
随着《网络安全等级保护2.0》和《商用密码应用安全性评估》的深入实施,企业面临双重合规压力:既要满足等保2.0对“主动防御”和“动态防护”的要求,又要通过密评密改强化密码技术的合规性。传统安全架构依赖边界防护和静态密码策略࿰…...
华为 MRAG:多模态检索增强生成技术论文阅读
GitHub项目链接:https://github.com/PanguIR/MRAGSurvey 总览 多模态检索增强生成(MRAG)通过将文本、图像、视频等多模态数据整合到检索与生成过程中,显著提升了多模态大语言模型(MLLM)的性能。传统检索增…...
文字光影扫过动效
列子1 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>光影扫过文字动效</title><styl…...
SpringBoot配置RestTemplate并理解单例模式详解
在日常开发中,RestTemplate 是一个非常常用的工具,用来发起HTTP请求。今天我们通过一个小例子,不仅学习如何在SpringBoot中配置RestTemplate,还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…...
计算机网络应用层(5)-- P2P文件分发视频流和内容分发网
💓个人主页:mooridy 💓专栏地址:《计算机网络:自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…...
C++ TCP通信原理与实现
C 中 TCP 通信的原理基于 TCP/IP 协议栈的实现,以下是核心原理和关键步骤的详细说明: 一、TCP 通信核心原理 面向连接 通信双方需通过 三次握手 建立可靠连接,确保通信通道稳定。通过 四次挥手 断开连接,保证数据完整性。 可靠传…...
计算机网络-运输层(1)
计算机网络-运输层(1) 文章目录 计算机网络-运输层(1)5.1 运输层概述5.2 运输层端口号、复用与分用端口号基本概念端口号特性端口号分类重要说明 5.3 UDP与TCP协议对比关键区别说明 5.1 运输层概述 计算机网络体系结构中的物理层、数据链路层以及网络层共同解决了主机通过异构…...
学习spark-streaming收获
1.流处理的核心概念 •实时 vs微批处理:理解了 Spark Streaming 的微批处理(Micro-Batch)模型,将流数据切分为小批次(如1秒间隔)进行处理,与真正的流处理(如Flink)的区…...