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.mfbz.cn/a/763001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在postman中调试supabase的API接口

文章目录 在supabase中获取API地址和key知道它的restfull风格在postman中进行的设置1、get请求调试2、post新增用户调试3、使用patch更新数据,不用put!4、delete删除数据 总结 在supabase中获取API地址和key 首先登录dashboard后台,首页- 右…

OFDM的缺点与关键技术

子载波间干扰英文简写ICI,ICI可能由各种原因引起 在多径信道中,CP小于最大附加时延时收发系统载波频率偏差和采样偏差收发系统相对移动,存在多普勒频移 ICI是制约OFDM系统性能的主要重要因素之一 对频率偏差敏感----->同步技术&#xff0…

Figma-ui设计学习APP Store

Figma汉化:Figma 中文社区_插件组件库,软件汉化教程 - Figma.Cool 选择Chorme汉化版离线包 插件安装: 打开浏览器安装扩展,解压加载进去即可。 打开标尺,设置左右内边距参考线(左21 右356),wi…

同一个excel表格,为什么在有的电脑上会显示#NAME?

一、哪些情况会产生#NAME?的报错 1.公式名称拼写错误 比如求和函数SUM,如果写成SUN就会提示#NAME?报错。 2.公式中的文本值未添加双引号 如下图: VLOOKUP(丙,A:B,2,0) 公式的计算结果会返回错误值#NAME?,这是因为公式中文本…

PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

反激开关电源反馈电路相关参数选型

Vb的电压正常变化范围是:0-1V(最低0V,由于有稳压管,最高不会超过1V) Vb的电压越高,则输出占空比越大,Vb电压越低,则输出占空比越小 那么Va的正常变化范围应该是:1.4-4.…

文本生成sql模型(PipableAI/pip-sql-1.3b)

安装环境 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install transformers 代码 question "What are the email address, town and county of the customers who are of the least common gender?"sc…

IT专业入门——高考假期预习指南,我来做你的引路人

目录 认识IT知识体系 什么是计算机 按规模、速度和功能分类 按照其工作模式分类 硬件 操作系统 编程语言 对学习语言的一点建议 对于学python的一点看法 网络 数据结构与算法 数据库 Web开发 Web前端 Web后端 基础预习指南 技术路线学习一览 学习资源推荐 刷…

白话负载均衡、正反向代理(入门科普版)

什么是负载均衡?为什么需要负载均衡 从字面上理解,什么是负载,服务器承受访问量的大小是负载,但是单台服务器的访问性能是有限的,最典型的例子就是双十一、春运抢票这种,这时候就需要一种方案来解决这类问…

ARM功耗管理软件之DVFSAVS

安全之安全(security)博客目录导读 思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS? 目录 一、ARM功耗管理软件之DVFS 二、ARM功耗管理软件之AVS 一、ARM功耗管理软件之DVFS 有一个实现特定…

SparkSQL调优

SparkSQL调优 文章目录 SparkSQL调优Explain 查看执行计划语法执行计划处理流程 资源调优内存说明spark任务提交到yarn上运行命令 CPU优化 SparkSQL语法优化基于RBO优化基于CBO优化广播join方式一:通过参数指定自动广播方式二:强行广播 SMB Join 数据倾斜…

Go线程实现模型-P

P 概述 P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联,以使P中的那些可运行的G能够及时获得,这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似 改变P的数量 改变单个Go程序间拥有的P的最大数量有两种方法 调…

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏 在安卓手机上进行屏幕录制是一项非常实用的功能,特别是对于需要录制游戏操作、制作教程或演示的用户来说。虽然部分安卓手机可能已经预装了屏幕录制功能,但有时候这些功能可能隐藏在…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息,更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

IMU在手语识别中的应用

近期,一款由美国和中国科研团队联合研发的新型的穿戴设备——SignRing,以其独特的IMU(惯性测量单元)技术,为聋哑人士的手语识别带来了革命性的突破。SignRing不仅极大地扩展了手语识别的词汇量,更提高了识别…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

windows USB设备驱动开发-双角色驱动

在USB的通讯协议中,规定发起连接的一方为主机(Host),接受连接的一方为设备,这可以用U盘插入电脑举个例子,当U盘插入电脑后,电脑这边主动发起查询和枚举,U盘被动响应查询和数据存取。 USB 双角色驱动程序堆…

为Ubuntu-24.04-live-server-amd64磁盘扩容

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 文章目录 系列文章目录前言一、检查系统本身情况1.用 lsblk 命令查看自己系统磁盘是什么状态2.用 df -h 命令查看文件系统的磁盘空间使用情况3.解决 Ubuntu-24.04 磁盘空间只能用一半的问题3-1扩展逻辑卷&#xff…