go语言中context的用法
0 概述
Context
是 Go 语言中非常重要的一个概念,它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中,Context
提供了更好的控制和管理,尤其是当你需要在多个 goroutine 之间传递状态或进行资源清理时。
1 主要功能
Context
主要有以下几个功能:
- 取消信号:通知一个或多个 goroutine 取消它们正在执行的工作。
- 超时和截止时间:指定操作的最大执行时间,防止阻塞操作过长时间。
- 传递请求范围数据:携带请求范围内的数据,通常用于请求 ID、用户信息等。
2 Context 的三种基本类型
Go 中的 context
包提供了几种常用的 Context
类型:
context.Background()
:通常作为根Context
,表示没有附加数据或取消信号的上下文。它通常是根上下文,作为其他上下文的父上下文。context.TODO()
:表示你暂时没有确定使用什么样的Context
,通常用于占位。context.WithCancel(parent)
:创建一个可取消的Context
,并返回一个取消函数,当你调用这个函数时,Context
会被取消。context.WithTimeout(parent, timeout)
:创建一个带有超时的Context
,指定最大等待时间,超过这个时间会自动取消。context.WithDeadline(parent, deadline)
:指定一个具体的截止时间,超过这个时间后自动取消。context.WithValue(parent, key, value)
:创建一个携带键值对数据的Context
,通常用于传递请求级别的数据(例如,用户身份信息)。
3 常见用法举例
3.1 context.WithCancel传递取消信号
主要场景:
- 手动控制并发任务的终止。
- 优雅退出:在一个任务中途需要取消时,用
cancel()
通知所有相关的 goroutine 停止执行。
代码示例:
package mainimport ("context""fmt""time"
)func main() {// 创建一个可取消的 Contextctx, cancel := context.WithCancel(context.Background())// 启动一个 goroutine,监听取消信号go func(ctx context.Context) {for {select {case <-ctx.Done(): // 检测到取消信号fmt.Println("Goroutine stopped")returndefault:// 模拟工作fmt.Println("Working...")time.Sleep(1 * time.Second)}}}(ctx)// 主线程等待 3 秒后取消time.Sleep(3 * time.Second)cancel() // 发送取消信号// 等待 goroutine 退出time.Sleep(1 * time.Second)fmt.Println("Main program exited")
}
解释:
- 主线程创建了一个带有取消功能的上下文
ctx
。 - 子 goroutine 使用
ctx.Done()
监听取消信号。 - 主线程 3 秒后调用
cancel()
,子 goroutine 检测到信号后优雅退出。
3.2 使用 WithTimeout
设置超时
context.WithTimeout
用于设置一个超时时间,超过该时间后 Context
会自动取消,适用于需要限时执行的操作。防止某些任务阻塞的时间过长。
package mainimport ("context""fmt""time"
)func main() {// 设置超时时间为 2 秒ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel() // 确保超时后取消 ctx// 启动一个模拟长时间执行的任务go longRunningTask(ctx)// 等待超时或任务完成<-ctx.Done()if ctx.Err() == context.DeadlineExceeded {fmt.Println("Timeout reached")}
}func longRunningTask(ctx context.Context) {select {case <-time.After(3 * time.Second): // 模拟长时间任务fmt.Println("Task completed")case <-ctx.Done():// 任务被取消或超时fmt.Println("Task cancelled due to timeout")}
}
WithDeadline 的用法和Withtime
out用法类似,只是一个传入的参数是等待时间,一个传入的参数是截止时间。
3.3 使用 WithValue
传递数据
context.WithValue
可以在 Context
中存储键值对,通常用于传递请求级别的数据(例如用户身份、请求 ID 等)。
package mainimport ("context""fmt"
)func main() {// 创建一个上下文并传递数据ctx := context.WithValue(context.Background(), "userID", 12345)// 将 ctx 传递给其他函数processRequest(ctx)
}func processRequest(ctx context.Context) {// 从 ctx 中提取数据userID := ctx.Value("userID")if userID != nil {fmt.Println("User ID:", userID)} else {fmt.Println("No user ID found")}
}
使用 WithValue
小心:context.WithValue
并不是用于传递大量数据的,主要用于传递少量的上下文信息,比如请求 ID 等。如果传递过多的数据,会使得 Context
难以维护。
4 常用的相关方法和常量
ctx.Done()
:返回一个 channel,当Context
被取消时该 channel 会被关闭。ctx.Err()
:返回Context
被取消的错误,通常是context.Canceled
或context.DeadlineExceeded
。ctx.Value(key)
:获取在Context
中传递的数据。
5 context如何控制goroutine的执行
从上面的举例可以看出,在每个goroutine中通过判断ctx.Done()是否被执行,从而知道任务是否被取消/超时/到达截止日期。
当 Context
被取消(调用 cancel()
)或超时/到达截止时间时,ctx.Done()
所关联的 channel 会关闭,此时select语句就可以执行ctx.Done()
对应的分支。
相关文章:
go语言中context的用法
0 概述 Context 是 Go 语言中非常重要的一个概念,它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中,Context 提供了更好的控制和管理,尤其是当你需要在多个 goroutine 之间传递状态或进行…...
概括网络给社会生活带来的种种影响
题目 【2002年国考申论】给定资料反映了网络给社会生活带来的种种影响,用不超过200字对这些影响进行概括。 要求:全面,有条理,有层次。(20分) 审题 特定事实:网络给社会生活带来的种种影响基本题型:单一…...
OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数,用于将点从齐次坐标(homogeneous coordinates)…...

Jmeter如何对UDP协议进行测试?
Jmeter如何对UDP协议进行测试? 1 jmeter-plugins安装2 UDP-Protocol Support安装3 UDP协议测试 1 jmeter-plugins安装 jmeter-plugins是Jmeter的插件管理器;可以组织和管理Jmeter的所有插件;直接进入到如下页面,选择如图的选项进…...

Unix 传奇 | 谁写了 Linux | Unix birthmark
注:本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远,文章有点“年头”,但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去,我们才能知其然,更知所以然。总结过去…...

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解
主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…...

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用
无人机与低空经济的关系密切,并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元,其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展,公共安防关乎每一个市民的生命财产安全。在…...

ORACLE逗号分隔的字符串字段,关联表查询
使用场景如下: oracle12 以前的写法: selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法: selectt.pro_ids,listagg(DIS…...

1.5 多媒体系统简介
目录 多媒体系统声音图形与图像动画和视频 多媒体系统 多媒体可分为感觉媒体、表示媒体、表现媒体、交换媒体。 感觉媒体:直接使人产生感觉的媒体,比如声音、图像、视频。表示媒体:计算机中记录感觉的数据格式。表现媒体:记录感觉…...

数据分析学习Day1-使用matplotlib生成2小时每分钟的气温可视化分析图
注意:需要提前下载matplotlib包 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple import matplotlib.pyplot as plt import random from matplotlib import font_manager # 数据准备 x list(range(121)) # 使用 list() 转换为列表 y [rando…...

ansible部署nginx:1个简单的playbook脚本
文章目录 hosts--ventoryroles执行命令 使用ansible向3台centos7服务器上安装nginx hosts–ventory [rootstand playhook1]# cat /root/HOSTS # /root/HOSTS [webservers] 192.168.196.111 ansible_ssh_passpassword 192.168.196.112 ansible_ssh_passpassword 192.168.196.1…...

三、汇总统计
1.SUM、COUNT、AVERAGE 注意:count函数是计算区域中包含数字的单元格的个数,以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候,可以根据实际情况看是…...
opencv实现给图像加上logo图像
要用Python和OpenCV给图片加上logo,可以按照以下步骤实现: 读取logo和image图片。 调整logo的大小以适应image。 将logo放置在image的指定位置。 将logo和image合并。 以下是实现代码: import cv2# 读取logo和image图片 logo cv2.imre…...

亚马逊云科技2024 re:Invent大会亮点:Nova大模型与AI基础设施全面升级
引言 作为云计算领域的年度盛会,亚马逊云科技(AWS)的re:Invent大会一直是业界瞩目的焦点。2024年的大会不负众望,推出了一系列重磅产品和服务,尤其是在人工智能和大模型方面的创新令人印象深刻。本文将为您深入解析此次大会的主要亮点,探讨AWS在AI时代的最新布局及其对行业的潜…...
总结与提升
今天学习了ai,对今天学习的内容进行总结。 本文参考chat gpt-4的训练文献。 模型架构基础 Transformer 架构:ChatGPT 采用了 Transformer 架构,这是一种基于自注意力机制的深度学习模型架构。它能够并行计算文本中的长期依赖关系ÿ…...

入门pytorch-Transformer
前言 虽然Transformer是2017年由Google推出,如果按照读论文只读近两年的思路看,那它无疑是过时的,但可惜的是,目前很多论文的核心依然是Transformer,或者由其进行改进的,故本文使用pytorch来搭建一下Trans…...

泛型编程--
auto自动推导数据类型 函数模板 定义和调用 函数模板具体化 函数模板通用版本之外的一个特殊版本 函数模板 具体化函数 ,它们的声明和定义都可以分开写。 声明 定义 函数模板写变量 模板参数缺省 类成员函数作为函数模板 类构造函数是函数模板 函数模板重载 函数模…...

【大语言模型】LangChain 核心模块介绍(Agents)
【大语言模型】LangChain 核心模块介绍(Agents) 一、简介二、Agents 的核心概念三、实战案例3.1、需求说明3.2、实现思路3.3、完整源码 一、简介 我们都知道四肢的绝大部分动作都是由大脑决定的,大脑通过中枢神经下发自己的操作指令…...

19C-RAC 环境mgmtca.trc.1过大
客户监控告警/u01使用率超过80%,通过一层层目录查看,发现是mgmtca.trc.1过大导致的告警 [rootgsdb1 ~]# du -sh /u01/app/grid/cfgtoollogs/mgmtca/mgmtca.trc.1 103G /u01/app/grid/cfgtoollogs/mgmtca/mgmtca.trc.1 查看MOS文档:Huge …...

基于Spring Boot的同城宠物照看系统的设计与实现
一、摘要 在快节奏的现代生活中,宠物已成为许多家庭不可或缺的一部分。然而,宠物照看服务的需求也随之增长。为了满足这一需求,我们设计并实现了一款同城宠物照看系统,该系统利用Java技术和MySQL数据库,为用户提供一个…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...