当前位置: 首页 > news >正文

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")
}

解释

  1. 主线程创建了一个带有取消功能的上下文 ctx
  2. 子 goroutine 使用 ctx.Done() 监听取消信号。
  3. 主线程 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 的用法和Withtimeout用法类似,只是一个传入的参数是等待时间,一个传入的参数是截止时间。

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.Canceledcontext.DeadlineExceeded
  • ctx.Value(key):获取在 Context 中传递的数据。

5 context如何控制goroutine的执行

从上面的举例可以看出,在每个goroutine中通过判断ctx.Done()是否被执行,从而知道任务是否被取消/超时/到达截止日期。

Context 被取消(调用 cancel())或超时/到达截止时间时,ctx.Done() 所关联的 channel 会关闭,此时select语句就可以执行ctx.Done()对应的分支。

相关文章:

go语言中context的用法

0 概述 Context 是 Go 语言中非常重要的一个概念&#xff0c;它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中&#xff0c;Context 提供了更好的控制和管理&#xff0c;尤其是当你需要在多个 goroutine 之间传递状态或进行…...

概括网络给社会生活带来的种种影响

题目 【2002年国考申论】给定资料反映了网络给社会生活带来的种种影响&#xff0c;用不超过200字对这些影响进行概括。 要求&#xff1a;全面&#xff0c;有条理&#xff0c;有层次。(20分) 审题 特定事实&#xff1a;网络给社会生活带来的种种影响基本题型&#xff1a;单一…...

OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数&#xff0c;用于将点从齐次坐标&#xff08;homogeneous coordinates&#xff09;…...

Jmeter如何对UDP协议进行测试?

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

Unix 传奇 | 谁写了 Linux | Unix birthmark

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

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;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在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…...

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下&#xff1a; oracle12 以前的写法&#xff1a; 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 以后的写法&#xff1a; selectt.pro_ids,listagg(DIS…...

1.5 多媒体系统简介

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

数据分析学习Day1-使用matplotlib生成2小时每分钟的气温可视化分析图

注意&#xff1a;需要提前下载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 注意&#xff1a;count函数是计算区域中包含数字的单元格的个数&#xff0c;以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候&#xff0c;可以根据实际情况看是…...

opencv实现给图像加上logo图像

要用Python和OpenCV给图片加上logo&#xff0c;可以按照以下步骤实现&#xff1a; 读取logo和image图片。 调整logo的大小以适应image。 将logo放置在image的指定位置。 将logo和image合并。 以下是实现代码&#xff1a; import cv2# 读取logo和image图片 logo cv2.imre…...

亚马逊云科技2024 re:Invent大会亮点:Nova大模型与AI基础设施全面升级

引言 作为云计算领域的年度盛会,亚马逊云科技(AWS)的re:Invent大会一直是业界瞩目的焦点。2024年的大会不负众望,推出了一系列重磅产品和服务,尤其是在人工智能和大模型方面的创新令人印象深刻。本文将为您深入解析此次大会的主要亮点,探讨AWS在AI时代的最新布局及其对行业的潜…...

总结与提升

今天学习了ai&#xff0c;对今天学习的内容进行总结。 本文参考chat gpt-4的训练文献。 模型架构基础 Transformer 架构&#xff1a;ChatGPT 采用了 Transformer 架构&#xff0c;这是一种基于自注意力机制的深度学习模型架构。它能够并行计算文本中的长期依赖关系&#xff…...

入门pytorch-Transformer

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

泛型编程--

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

【大语言模型】LangChain 核心模块介绍(Agents)

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

19C-RAC 环境mgmtca.trc.1过大

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

基于Spring Boot的同城宠物照看系统的设计与实现

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

弦音墨影惊艳演示:水墨粒子汇聚成目标Bounding Box的动态生成过程

弦音墨影惊艳演示&#xff1a;水墨粒子汇聚成目标Bounding Box的动态生成过程 1. 系统概述与核心特色 「弦音墨影」是一款将先进人工智能技术与东方美学完美融合的视频分析系统。不同于传统技术工具的冰冷界面&#xff0c;这个系统以水墨丹青为设计灵魂&#xff0c;通过Qwen2…...

Qwen2.5-VL图文对话模型5分钟快速部署:零基础搭建智能识图助手

Qwen2.5-VL图文对话模型5分钟快速部署&#xff1a;零基础搭建智能识图助手 1. 准备工作 1.1 了解Qwen2.5-VL模型 Qwen2.5-VL-7B-Instruct-GPTQ是一款强大的多模态图文对话模型&#xff0c;基于Qwen2.5-VL-7B-Instruct模型经过AngelSlim压缩优化而来。这个模型能够&#xff1…...

卡证检测矫正模型Web界面使用教程:中文操作+实时结果可视化

卡证检测矫正模型Web界面使用教程&#xff1a;中文操作实时结果可视化 你是不是经常需要处理身份证、护照、驾照这些卡证图片&#xff1f;比如要上传证件照办业务&#xff0c;或者批量处理一堆证件材料。最头疼的就是拍出来的照片歪歪扭扭&#xff0c;背景杂乱&#xff0c;还得…...

从一块“三无”FPGA板看硬件设计:电源去耦、DDR端接与8层层叠分析

从一块“三无”FPGA板看硬件设计&#xff1a;电源去耦、DDR端接与8层层叠分析 拆解一块没有原理图、没有BOM、没有设计文档的"三无"FPGA板&#xff0c;就像打开一个黑匣子。当我在二手平台看到这块Cyclone IV EP4CGX110核心板时&#xff0c;第一反应是&#xff1a;这…...

Ostrakon-VL-8B部署排错大全:从网络连接到显存优化的常见问题解决

Ostrakon-VL-8B部署排错大全&#xff1a;从网络连接到显存优化的常见问题解决 最近在星图GPU平台上折腾Ostrakon-VL-8B这个多模态大模型的朋友应该不少&#xff0c;它既能看懂图片又能生成文字&#xff0c;功能确实挺吸引人。但说实话&#xff0c;从部署到稳定运行&#xff0c…...

MacBook上运行OpenClaw:轻量级部署Kimi-VL-A3B-Thinking图文模型

MacBook上运行OpenClaw&#xff1a;轻量级部署Kimi-VL-A3B-Thinking图文模型 1. 为什么选择MacBook部署OpenClaw 作为一个长期在MacBook Pro上折腾AI工具的开发者&#xff0c;我一直在寻找能在本地流畅运行的多模态模型方案。直到遇到Kimi-VL-A3B-Thinking这个镜像&#xff0…...

React-md-editor性能优化:如何提升大型文档编辑体验

React-md-editor性能优化&#xff1a;如何提升大型文档编辑体验 【免费下载链接】react-md-editor A simple markdown editor with preview, implemented with React.js and TypeScript. 项目地址: https://gitcode.com/gh_mirrors/re/react-md-editor React-md-editor…...

Seaborn 绘图基础

在 Python 的数据可视化生态中&#xff0c;Seaborn 是建立在 Matplotlib 之上的高级统计绘图库。它面向数据分析任务提供了更直接的绘图接口&#xff0c;能够围绕变量的分布、关系与结构组织图形表达&#xff0c;因此特别适合教学入门与探索性数据分析。与只关注“如何画出线、…...

单片机AD采样十大滤波算法详解与应用

1. 单片机AD采样滤波算法概述在嵌入式系统开发中&#xff0c;ADC采样是获取模拟信号的关键环节。然而实际应用中&#xff0c;采样值常会受到各种干扰影响&#xff0c;导致数据波动甚至错误。作为一名有着十年嵌入式开发经验的工程师&#xff0c;我总结了十种最实用的AD采样滤波…...

空洞骑士模组管理新体验:Scarab让模组安装变得简单高效

空洞骑士模组管理新体验&#xff1a;Scarab让模组安装变得简单高效 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经因为空洞骑士模组安装的复杂性而感到困扰&#x…...