Go context的理解

简介: 本文介绍了Go语言中的`context`及其使用方法。`context`是Go语言独有的结构,适用于协程间通信与控制。文章首先讲解了`channel`和`select`的基础知识,作为理解`context`的前提。接着分析了终止协程的三种方法:全局变量、`select+channel`和`context`,指出`context`是最优雅的选择,因其能实现信号传递,控制协程树形结构。`context`的主要功能包括传递键值对、超时控制和主动取消任务。最后,通过将`context`比喻为流经程序的河流,形象地说明了其在方法参数中的重要性。

context是什么

context是一个Go语言独有的结构,不太好用其他语言的类型做例子,具体的功能需要通过例子来表示

channel和select

在了解context使用方法时,需要先理解channel和select的使用,在这里我不详细解释,大概介绍下他们的作用

channel

channel类似于java里的阻塞队列,是一个优雅的线程安全的工具

想了解他的原理,可以看下

juejin.cn/post/697140…

select

select也是go独有的一个东西,他的使用方法类似于switch,但他的输入值只能是channel,如果没有channel可以操作就会被阻塞,有的话就会选择case运行。如果有多个channel可以操作,就随机选择一个运行。如果有default方法的话,即时没有channel可以操作,也不会阻塞,而是直接调用default的方法。

示例

首先协程在运行过程中,它指令没有执行完是不会终止的。也就是说写了一个死循环,协程自己会一直运行下去。那么想要终止协程的话,有三种方法

  1. 使用全局变量
  2. 使用select,channel
  3. 使用context

全局变量是最容易想到的方法,这种方法的问题就是会有线程安全问题,所以需要使用锁。

使用select,channel

go

func recycle(c <-chan int) {
	for true {
		select {
		case <-c:
			fmt.Println("a")
		default:
			fmt.Println("循环中")
		}
	}

}

相对于全局变量更优雅,对于协程较少来说,是可以使用的。但是协程如果嵌套协程或者有很多层协程,这个关系会很复杂。

所以最优雅的方式就是使用context,这也就引出了他的一个功能,他可以进行信号传递,可以实现上游取消信号,下游任务自行取消的效果

功能

  1. 传递key value
  2. 超时控制
  3. 主动取消控制

context是一个树形结构,当控制一个节点的时候,意味着他的子节点也会被控制。

例如有一个服务调用超时,应该返回失败的数据,但是子协程还在运行,这是没有必要的,就可以通过context阻止子协程的运行。

使用方法

形象的来说就是把 Context 想象为一条河流流过你的程序,每个方法参数开头都一定要是context


转载来源:https://juejin.cn/post/6973957508146659336


相关文章
|
12月前
|
监控 前端开发 Java
Spring拦截链的实现原理是什么?
拦截器是Spring MVC中处理请求的重要机制,通过拦截链可在请求的不同阶段插入自定义逻辑。本文详解拦截链的实现原理、核心组件如HandlerMapping、HandlerAdapter、DispatcherServlet和HandlerInterceptor的作用,以及拦截器在请求处理中的工作流程。了解这些内容有助于开发者更好地掌握Spring MVC的请求处理机制,并灵活应用于权限验证、日志记录等场景。
181 1
|
11月前
|
人工智能 Java
Java多任务编排技术
JDK 5引入Future接口实现异步任务处理,但获取结果不够灵活。Java 8新增CompletableFuture,实现异步任务编排,支持流式处理、多任务组合及异常处理,提升执行效率与代码可读性,简化并发编程复杂度。
248 0
|
11月前
|
人工智能 JavaScript 前端开发
js删除对象属性
本文介绍了JavaScript中删除对象属性及数组元素的多种方法,包括设置属性为undefined、使用delete操作符、对象解构、Reflect.deleteProperty方法以及数组的delete和splice操作。每种方法均有示例代码及关键特性说明,适用于不同场景下的属性或元素删除需求,帮助开发者更高效地处理对象和数组的操作。
412 0
js删除对象属性
|
12月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
283 1
|
12月前
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
391 2
|
11月前
|
人工智能 安全 Go
go快速上手:golang中的反射
本文深入解析Go语言反射机制,涵盖reflect包的核心类型与操作方法,通过实例演示如何动态获取类型信息、修改值及调用方法,并探讨反射的高级用法与注意事项,帮助开发者合理高效地使用反射。
447 1
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
359 6
Python 实现单向链表,和单向链表的反转
|
12月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1658 1
|
12月前
|
XML 人工智能 Java
优化SpringBoot程序启动速度
本文介绍了三种优化SpringBoot启动速度的方法:1) 延迟初始化Bean,通过设置`spring.main.lazy-initialization`为true,将耗时操作延后执行;2) 创建扫描索引,利用`spring-context-indexer`生成@ComponentScan的索引文件,加速类扫描过程;3) 升级至最新版SpringBoot,享受官方性能优化成果。这些方法能显著提升程序编译与启动效率。
2159 0
|
11月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
742 0