Golang-context理解

news2024/12/24 8:40:32


golang-context笔记整理

    • golang为何设计context?
    • 代码上理解原理
      • 空context类
      • cancelCtx类
        • .withcancelctx方法
      • timerCtx类
      • valueCtx类

golang为何设计context?

有并发特性的语言中,都会有一种说法:创建异步线程或者携程的时候,如果不知道它们什么时候终止就不应该创建它。背后意思就是不能滥用并发,要做到心中有数的并发控制。 所以有context最主要目的就是用来做并发控制。

代码上理解原理

协程的执行是一条链路,context的设计也是基于链路来实现层级结构中传递取消信号和其他数据的。所以cancelctx,timectx,valuectx这三个类的结构体中,都有一个嵌入父亲context的字段。
核心数据结构:context接口,有4个API。后面的几个类实现这4个API。
image.png
Done 返回的是只读channel,用于传递取消信息。

空context类

context.Background() 或者context.TODO() 返回 emptyCtx类型实例(空context)。空context也实现了接口的4个API的框架,不过是空实现。

cancelCtx类

image.png
嵌入context结构体。因为cancelctx不能作为context链路的根
Context作为并发链路上的公用数据结构,所以有锁
Done()API需要返回一个只读channel,所以有一个通道
子context 用一个map管理
返回的err

cancelctx类实现了done、err、value这3个方法,前两个比较实现比较简单,就是加锁然后返回通道或者err。 value方法的实现上埋了一个伏笔,判断cancelctxkey是否= 传入的key,如果是就返回当前ctx
image.png

.withcancelctx方法

image.png
返回派生context 以及一个 cancel函数(可以终止该派生context以及该context的所有子context)
如何做到父亲cancle后,孩子能cancel的单向取消链路? 这就是withcancel()方法中调用的 propagate方法(父ctx, 子ctx)实现的。
在这个方法中会判断父ctx是否是cancelctx,如果是,withcancel创建的派生ctx会被加入到cancelctx类的子ctx的map中。 如果不是cancelctx,但是又有cancel()能力,则会创建一个守护协程去监听父Ctx何时取消,一旦父ctx取消,派生的cancelctx就取消。

如何判断父ctx是不是cancalctx?这就收回之前说的cancelctx实现的value方法中的cancelctx独有的一个协议,判断key是否== cancelctxkey,如果是,就返回ctx本身。progatecancel()中调用了一个parentctx()方法,其中就调用了value方法,从而判断父ctx是否是cancelctx,是的话就加入父ctx的子ctx map中,不是的话就启用守护协程。

withcancel()返回的cancel()方法。
cancel方法要实现的主要是三点(其实根据cancelctx类也能猜测要做的是什么): 补充当前ctx的err; 修改channel把channel关闭,从而让上游ctx能通过Done()方法捕捉到到当前ctx取消的信号;取消当前ctx,并且有义务将子ctxmap中的ctx全部都取消掉
另外,在cancel中还会调用之前withcancel生产派生ctx时的 progatecancel中的parentctx方法来判断父ctx是否为cancelctx,如果是,还需要在父ctx的map中删除当前ctx

timerCtx类

继承自cancelctx类,在cancel类的基础上封装,新增了timer用于定时终止ctx,另外新增deadline字段用于返回timerctx的过期时间。
image.png
方法:
timerCtx.Deadline()方法,context接口中的deadline 这个API只在timerCtx中实现,用来展示过期时间。

timerCtx.cancel()方法,复用了cancelCtx的cancel方法,细节上补充了一个停止timer计时。因为直接调用cancel了,就没必要浪费资源了。

timerCtx.WithTimeout()方法,实现上,在父ctx不空的情况下,首先判断给定的过期时间是不是比父ctx还晚,如果是,那就直接返回cancelCtx以及cancel闭包(如果父ctx有deadline,并且结束时间比新ctx的结束时间还早就没必要把新ctx设定为timerCtx了,父ctx过期的时候会因为链路问题把子Ctx一并取消掉)。 如果不是,生成已给timerCtx,并且通过progatecancel方法将父、子ctx的cancel进行同步,保证cancel的单向传递。启用time.until(d)进行计时

valueCtx类

image.png
嵌入context,另外有一个kv对。

方法上:
valueCtx.Value()方法,判断传入key是否==当前valueCtx的key,如果是则返回对应的val,如果不是,则在一个for循环里面通过Ctx.Context取父context不断向上进行匹配。 直到找到key。
value.WithValue()方法, 返回一个valueCtx。这个ValueCtx的第一个字段Context被调用该方法的parent赋值了。image.png

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Altium】如何处理PCB上所有焊盘被误盖油

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决焊盘被误盖油的操作 2、 问题场景 所有焊盘都可以设置为盖油或不盖油,由于焊盘需要用来焊接元器件,所以都不会设置盖油。由于误操作或者创建封装时设置错误,造成一定数量的焊盘…

【GD32】07 - UART串口通信

GD32F407中的UART 今天我用的型号是GD32F407,用其他型号的小伙伴在使用UART的时候注意一下自己手上板子的资源就行,我们使用固件库就算是不同型号其实也是没有什么太大差别的。 我们废话不多说,直接开始讲怎么使用UART。 首先我们先确定串…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…

猫头虎博主全栈前沿AI技术领域矩阵社群

猫头虎博主全栈前沿AI技术领域矩阵社群 👋大家好,我是猫头虎!今天我要向大家介绍一个非常重要的社群矩阵——专为全栈前沿AI技术领域的朋友们打造的各种技术交流和资源互助的社群。这些社群不仅能帮助大家快速提升技术水平,还能拓…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 混淆矩阵 假设我们有包含临床测量数据的医疗数据,例如胸痛、良好的血液循环、动脉阻塞和体重…

LeetCode 子集

原题链接78. 子集 - 力扣(LeetCode) 这是一道暴力搜索问题参考大佬们的题解,对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择,递归调用进入下一层 4.回溯,返回到递归前的状态 要完成前面这…

Golang内存分配

Go内存分配语雀笔记整理 Golang内存模型设计理念思考核心代码阅读mspanmcachemcentral中心缓存mheap分配过程 Golang内存模型设计理念思考 golang内存分配基于TCmalloc模型,它核心在于:空间换时间,一次缓存,多次复用;…

重大丨深中通道今通车!继港珠澳大桥后,三思再度点亮世界工程

6月30日下午3时,国家重大工程深中通道正式通车试运营,向世界再次展示中国智慧和基建实力。已承接过包括港珠澳大桥海底隧道在内2500多条隧道照明工程的上海三思电子工程有限公司,为这座超级工程提供了LED隧道照明、东西人工岛照明及显示、管理…

HAP官方力作:MEGA项目管理应用正式上线

开发背景 自2024年3月起,明道云推出了MEGA系列应用,基于MEGA Industrial的经营业务,逐步拓展至企业价值链的各个环节(MEGA Industrial Co 是明道云预设的一家虚拟公司,主要面向工业制造行业客户,提供产线规…

node_modules/@umijs/runtime“ does not exist in container.

近日,在做pro ant react 项目时,遇到了如下这样的错误,开始通过vs code 的通义灵码折腾了一阵子,后面在csdn上一搜索,马上就找到答案了,特记录一下,后面再遇到这样的问题也就有迹可循了。 参考…

强对抗的 SquidLoader 针对中国企业发起攻击

研究人员近期发现了一种高对抗强度的 Loader,其通过钓鱼邮件附件传递给受害者。根据恶意软件所具备的引诱和规避行为,研究人员将其命名为 SquidLoader。SquidLoader 最早在 2024 年 4 月下旬被发现,但研究人员认为其至少已经活跃了一个月以上…

AE射频电源维修PE-II 10K中频电源维修

AE CESAR射频电源维修 PEII-10K镀膜电源;射频电源RF-5S;RFG3000;RFG3001等系列维修。 主要服务于太阳能光伏、PVD镀膜,半导体薄膜、离子注入、刻蚀,平板显示,光盘、光电子LED等制造工艺以及科研院校、技术研…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域,目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展,尤其是卷积神经网络(CNN)的广泛应用,目标检测与视频轨迹追踪的性能得到…

2024年广东省食品安全管理员考试精选练习题库

76.已具有主体资格的企业申请食品流通可,该企业的()为可申请人。 A.投资者 B.经营负责人 C.本身 答案:C 77.食用亚硝酸盐的销售只面向()。 A.食品生产加工行业 B.餐饮业 C.食品流通单位 答案&…

Rakis: 免费基于 P2P 的去中心化的大模型

是一个开源的,完全在浏览器中运行的去中心化 AI 推理网络,用户无需服务器,打开即可通过点对点网络使用 Llama-3、Mistral、Gemma-2b 等最新开源模型。 你可以通过右上角的 Scale Worker ,下载好模型后挂机就能作为节点加入到这个…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天,精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此,开发了一个基于深度学习的商品销售数据预测系统,该系统利用Python编程语言与Django框架&a…

数据结构与算法笔记:实战篇 - 剖析搜索引擎背后的经典数据结构和算法

概述 像百度、Google 这样的搜索引擎,在我们平时的工作、生活中,几乎天天用到。如果我们把搜索引擎也当做一个互联网产品的话,那它跟社交、电商这些类型的产品相比,有一个非常大的区别,那就是,它是一个技术…

内容分发网络(CDN)学习记录

目录 静态内容动态内容CDN工作原理CDN缓存 CDN关键技术1.内容路由功能2.内容分发技术:内容分发技术主要是PUSH和PULL3.内容存储技术4.内容管理技术 全局负载均衡基于DNS的GSLB基于HTTP重定向的GSLB基于IP欺骗的GSLB服务器群选择策略 静态内容 静态内容是不会因用户…

隐私计算实训营第二期第七课:XGB算法与SGB算法开发实践

隐私计算实训营第二期-第七课 第七课:XGB算法与SGB算法开发实践1 决策树模型1.1 决策树的训练和预测过程1.2 决策树的发展过程 2 GBDT模型2.1 Boosting核心思想2.2 GBDT原理 3 XGB模型3.1 XGB核心思想3.2 XGB优点 3 隐语纵向树模型3.1 数据纵向分割3.2 隐私保护的树…