Golang-context理解


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.mzph.cn/pingmian/39150.shtml

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

相关文章

【TS】TypeScript 入门指南:强大的JavaScript超集

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 入门指南:强大的JavaScript超集一、TypeScript 简介1.1 …

SpringBoot实现图片添加水印(完整)

提示:昨天不是写了一个类似与图片添加水印的版本吗,今天来写一个带数据库,并且可以完整访问的版本 文章目录 目录 文章目录 引入库 配置文件 数据库配置 字段配置 索引配置 数据库表语句 启动文件 前端代码 整体代码目录 配置类AppConfig Contro…

用可视化的方式学统计学

本次分享一个统计学学习工具:看见统计。 看见统计致力于用数据可视化 (使用D3.js完成) 让统计概念更容易理解,源于布朗大学几位作者👇 看见统计共有6个章节, 下面来看看具体内容, 中心极限定理 对于一个(性质比较好的)分布,如果我们有足够大的独立同分布的样本,其…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么,而不是以什么形式做。 以函数式接口Runnable为例讲解: public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

C语言实现简单的minishell

探索开源项目:MiniShell 引言 在计算机编程的世界里,Shell 是一个至关重要的组成部分,它允许用户与操作系统交互,执行命令和程序。MiniShell 是一个简化版的 Shell 程序,通常用于教学和学习目的。在本文中&#xff0…

《梦醒蝶飞:释放Excel函数与公式的力量》8.2 COUNTA函数

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果,是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

创新校园服务模式 跑腿小程序平台源码构建与实践 前后端分离 带完整的安装代码包以及部署教程

系统概述 本项目是一个集任务发布、接单、支付、评价于一体的跑腿服务小程序平台,专为高校校园设计。系统采用前后端分离架构,前端负责用户界面展示和交互逻辑,后端处理业务逻辑、数据存取等,两者通过API接口进行通信&#xff0c…

二叉树的右视图-二叉树

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 层序遍历&#xff0c;广度优先 queue先进后出&#xff0c;每层从左往右进树&#xff0c;最后一个就是最右边的数&#xff1b;pop掉这层的。push下一层&#xff1b; class Solution { public:vector<int> r…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

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

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

如何将音频文件发送至摄像头

目前再很多互联互通的场景下&#xff0c;如AI盒子再从摄像头上取视频分析&#xff0c;分析出发生某个事件&#xff0c;需要反向通过摄像头的喇叭播放语音&#xff0c;发出告警提示&#xff0c;使用场景如下 盒子上对于此类场景的需求往往不能满足&#xff0c;或者为这个需求需要…

APP性能测试

1、性能测试分类&#xff1a;&#xff08;CPU&#xff0c;内存&#xff0c;流量&#xff0c;时间&#xff08;启动耗时计算&#xff09;&#xff0c;电量&#xff0c;流畅度&#xff08;帧率&#xff09;&#xff09;&#xff0c;稳定性&#xff08;崩溃&#xff0c;闪退&#…

感动的短视频:成都柏煜文化传媒有限公司

感动的短视频&#xff1a;瞬间触动心灵的温暖力量 在这个快节奏、高压力的时代&#xff0c;我们常常在忙碌与喧嚣中穿梭&#xff0c;心灵深处那份最纯粹的感动似乎变得愈发珍贵而难得。然而&#xff0c;就在这样一个数字化盛行的今天&#xff0c;短视频以其独特的魅力&#xf…

二百四十二、Hive——Hive的动态分区表出现day=__HIVE_DEFAULT_PARTITION__分区

一、目的 Hive的DWD层动态分区表的分区出现day__HIVE_DEFAULT_PARTITION__&#xff0c;有点懵&#xff0c;而且表中数据的day字段也显示__HIVE_DEFAULT_PARTITION__ 1、DWD层动态分区表的分区 __HIVE_DEFAULT_PARTITION__ 2、DWD层分区字段day数据 __HIVE_DEFAULT_PARTITION…

农业气象监测仪:现代农业的“守护神”

随着科技的不断进步&#xff0c;农业生产也逐渐迈入了智能化的新时代。在众多的农业科技产品中&#xff0c;农业气象监测仪以其独特的优势&#xff0c;成为了现代农业不可或缺的一部分。本文将从多个角度探讨农业气象监测仪在农业中的优势&#xff0c;以及它如何助力农业生产实…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…

pdf合并工具,pdf合并器,多个pdf合并成一个pdf

你是否有过这样的困扰&#xff1a;手头上有好几个pdfF文档&#xff0c;需要将它们合并成一个单一的文件&#xff0c;但却不知道从何下手&#xff1f;别担心&#xff0c;这篇文章将为你揭秘多个pdf合并成一个pdf的方法&#xff0c;让你轻松实现pdf文档整合的问题&#xff01; 首…

python 中的 下划线_ 是啥意思

在 Python 中&#xff0c;_&#xff08;下划线&#xff09;通常用作占位符&#xff0c;表示一个变量名&#xff0c;但程序中不会实际使用这个变量的值。 目录 忽略循环变量&#xff1a;忽略函数返回值&#xff1a;在解释器中使用&#xff1a;举例子1. 忽略循环变量2. 忽略不需…

11集在Docker上编译tensorFlow Lite MCU例子工程-《MCU嵌入式AI开发笔记》

【11集在Docker上编译tensorFlow Lite MCU例子工程-《MCU嵌入式AI开发笔记》】 这一集咱们一步一步的在doc下面编译TensorFlow Lite的例程 https://tensorflow.google.cn/lite/tutorials?hlzh-cn 进入这个例子&#xff1a; https://codelabs.developers.google.cn/codelabs/…

C# Web控件与数据感应之属性统一设置

目录 关于属性统一设置 准备数据源 范例运行环境 AttributeInducingFieldName 方法 设计与实现 如何根据 ID 查找控件 FindControlEx 方法 调用示例 小结 关于属性统一设置 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&…