当前位置: 首页 > 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;为用户提供一个…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...