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


相关文章
|
6天前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
113 58
|
15天前
|
人工智能 程序员 PHP
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
AI攻破最后防线!连架构设计都能自动生成,中级程序员集体破防
171 10
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
|
13天前
|
自然语言处理 API 开发工具
端午出游高定:通义灵码+高德 MCP 10 分钟定制出游攻略
本文介绍了如何使用通义灵码编程智能体与高德 MCP 2.0 制作北京端午3天旅行攻略页面。首先需下载通义灵码 AI IDE 并获取高德申请的 key,接着通过添加 MCP 服务生成 travel_tips.html 文件,最终在手机端查看已发布上线的攻略。此外还详细说明了利用通义灵码打造专属 MCP 服务的过程,包括开发计划、代码编写、部署及连接服务等步骤,并提供了自由探索的方向及相关资料链接。
338 96
|
13天前
|
人工智能 供应链 安全
实现企业级 MCP 服务统一管理和智能检索的实践
本文将深入剖析 MCP Server 的五种主流架构模式,并结合 Nacos 服务治理框架,为企业级 MCP 部署提供实用指南。
331 63
|
22天前
|
人工智能 芯片 开发者
鸿蒙电脑的诞生是国产操作系统的破壁之战
鸿蒙电脑的诞生标志着国产操作系统的重大突破。在Windows和Mac OS主导的市场中,华为凭借“全栈自研+分布式架构+系统级AI”创新组合,推出搭载HarmonyOS 5的HUAWEI MateBook Fold与MateBook Pro,实现从底层内核到用户体验的完全自主可控。作为混沌初开的“鸿蒙”,不仅补齐了华为“1+8+N”生态拼图,更开启了中国科技自立自强的新篇章。尽管生态建设仍在起步阶段,但已为全球电脑操作系统市场带来新格局。开发者可通过掌握ArkTS语言、利用分布式能力、参与开源项目等方式,抓住这一历史性机遇。
71 30
鸿蒙电脑的诞生是国产操作系统的破壁之战
|
21天前
|
前端开发 搜索推荐 开发者
如何快速创建一个轻量美观的导航站?Typecho + MijiNav组合轻松完成
在信息过载的数字化时代,打造一个高质量、美观的网址导航页至关重要。本文推荐使用Typecho + MijiNav组合,轻松实现个性化导航网站。Typecho作为轻量级博客系统,安装简单、资源占用低;MijiNav主题设计现代、响应式适配多设备,并支持灵活自定义。通过三步:安装Typecho、配置MijiNav主题、自定义内容,非开发者也能快速搭建专业级导航页,满足个人与企业需求。
120 40
|
25天前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
100 32
|
25天前
|
XML 安全 前端开发
一行代码搞定禁用 web 开发者工具
在如今的互联网时代,网页源码的保护显得尤为重要,特别是前端代码,几乎就是明文展示,很容易造成源码泄露,黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的 Web 开发者工具面板,今天推荐一个不错的 npm 库,可以帮助开发者更好地保护自己的网站源码,本文将介绍该库的功能和使用方法。 功能介绍 npm 库名称:disable-devtool,github 路径:/theajack/disable-devtool。从 f12 按钮,右键单击和浏览器菜单都可以禁用 Web 开发工具。 🚀 一行代码搞定禁用 web 开发者工具 该库有以下特性: • 支持可配
90 22
|
23天前
|
机器学习/深度学习 运维 搜索推荐
大数据分析如何精准拿捏你的移动应用体验?
大数据分析如何精准拿捏你的移动应用体验?
59 10