Go语言中context 结构原理, 使用场景和用途

ops/2024/12/26 11:03:36/

Go语言中context结构原理

在Go语言中,context是一个用于在API边界之间传递请求范围的值、取消信号、截止时间等信息的机制。它主要用于处理跨API边界的请求取消、超时控制以及传递请求范围内的共享数据。context的设计目标是为了解决在并发编程中,特别是Goroutines之间相互协作时,如何有效地管理多个Goroutines的生命周期、处理取消信号和超时等问题。

context实际上只定义了一个接口,并提供了几个实现类。以下是context接口及其实现类的简要说明:

  1. Context接口
    • Deadline() (deadline time.Time, ok bool):返回context的过期时间。
    • Done() <-chan struct{}:返回一个关闭的通道,当context被取消或过期时,该通道会被关闭。
    • Err() error:返回context被取消或过期的原因。
    • Value(key any) any:返回context中对应key的值。
  2. 实现类
    • emptyCtx:一个空的context,不可取消,没有值,没有截止时间。通常用于程序的入口点、主函数或测试中。
    • cancelCtx:一个可取消的context,依赖于父context。当调用其cancel函数时,会通知所有子context取消操作。
    • timerCtx:一个带有截止时间的context,当超过设定的时间点时,会自动取消。
    • valueCtx:用于在context中传递请求范围的数据。

context的实现原理是基于一个继承关系的树状结构。每个context都有一个父context,通过链式调用的方式将context串联起来。当父context被取消或过期时,其所有子context也会被相应地取消或过期。这种机制是通过在context内部维护一个done通道和一个children哈希表来实现的。当父context的done通道被关闭时,会遍历children哈希表,调用当前所有子context的取消函数,从而实现继承链上连锁的取消反应。

context使用场景和用途

  1. 控制Goroutines生命周期
    • 当客户端取消请求时,后台Goroutine应该能够及时响应并停止执行。通过使用context,可以将取消信号传递给所有相关的Goroutine,从而实现对它们生命周期的有效控制。
  2. 超时处理
    • 为长时间运行的任务设置超时时间,以确保它们不会阻塞程序的其他部分。当任务超过设定的超时时间时,context会自动取消,从而触发相应的取消逻辑。
  3. 传递数据和元信息
    • 在请求的上下文中传递数据,如认证凭据、请求ID或用户身份信息。这可以避免使用全局变量或参数列表不断增长的问题,同时保持代码的清晰和可维护性。
  4. 微服务架构中的链路追踪
    • 在微服务架构中,一个服务调用另一个服务时,可以通过context传递关于原始请求的信息,如请求ID。这有助于进行链路追踪和日志记录,从而更容易地诊断问题并跟踪请求的处理过程。

总之,context是Go语言中一个非常重要的机制,它能够帮助开发者在并发编程中更好地管理Goroutines的生命周期、处理取消信号和超时等问题,并传递请求范围内的共享数据。


http://www.ppmy.cn/ops/145108.html

相关文章

SAM大模型实践(六)

今天试了一下geo-SAM快速版本fast-sam&#xff0c;项目参考地址如下&#xff1a; https://samgeo.gishub.org/examples/fast_sam/https://samgeo.gishub.org/examples/fast_sam/具体代码如下&#xff1a; # %pip install segment-geospatial segment-anything-fast # 在conda…

【Java基础面试题025】什么是Java的Integer缓存池?

回答重点 Java的Integer缓存池&#xff08;Integer Cache&#xff09;是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此缓存这些对象可以减少内存分配和垃圾回收的负担&#xff0c;提升性能 在 -128到127范围内的Integer对象会…

常见网络攻击场景常被用于测试系统安全性

常见网络攻击场景常被用于测试系统安全性 在区块链系统中,以下网络攻击场景常被用于测试系统安全性: 51% 攻击 攻击原理:当一个或一组攻击者控制了超过全网 50%的算力时,就有可能操纵区块链的账本记录。在工作量证明(PoW)机制下,攻击者可以通过算力优势,实现对新区块的…

聊一聊 C#线程池 的线程动态注入

一&#xff1a;背景 1. 讲故事 上一篇我们用 Thread.Sleep 的方式演示了线程池饥饿场景下的动态线程注入&#xff0c;可以观察到大概 1s 产生 1~2 个新线程&#xff0c;很显然这样的增长速度扛不住上游请求对线程池的DDOS攻击&#xff0c;导致线程池队列越来越大&#xff0c;但…

[OpenGL]使用TransformFeedback实现粒子效果

一、简介 本文介绍了如何使用 OpenGL 中的 Transform Feedback 实现粒子效果&#xff0c;最终可以实现下图的效果&#xff1a; 本文的粒子系统实现参考了modern-opengl-tutorial, ogldev-tutorial28 和 粒子系统–喷泉 [OpenGL-Transformfeedback]。 二、使用 TransformFeed…

浏览器http缓存问题

一、什么是浏览器缓存 浏览器将请求过的资源&#xff08;html、js、css、img&#xff09;等&#xff0c;根据缓存机制&#xff0c;拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件…

【汇编】关于函数调用过程的若干问题

1. 为什么需要bp指针&#xff1f; 因为bp是栈帧的起始地址&#xff0c;函数内的局部栈变量&#xff0c;采用相对bp的内存寻址。不能相对于sp&#xff0c;sp是一直在变的。 2. 函数调用过程&#xff1f; 函数开始&#xff0c;先压栈bp&#xff0c;保存父函数栈底指针bp&#…

[Router]路由器常用的后台判断网络ping 可靠公共 IP 地址整理

接受ICMP公共DNS地址 接受 ICMP 的公有 IPv4 和 IPv6 端点的集合&#xff0c;如果使用 ping 方法&#xff0c;则可以使用来跟踪接口的连接状态。这些是具有高可用性的&#xff0c;通常可以可靠地用作确认网络连接的终端节点。或者&#xff0c;您也可以使用 ISP 的 DNS 解析器&a…