Go语言中context原理及使用

Golang中,context为我们提供了在跨API边界和进程之间传递请求作用域的deadline,取消信号,和其他请求响应的值的能力。

context包定义了Context类型,它在API边界和进程之间提供了一种传递传递请求作用域的deadline,取消信号,和其他请求响应的值的能力。一个Context的生命周期通常与请求处理的生命周期相同,并且可以包含在多个API调用和goroutine之间共享数据和取消信号。

context的主要方法有:
  • Deadline:返回当前Context合适会被取消。如果Context不会被取消,则返回ok为false
  • Done:返回一个通道,当Context被取消或超时的时候,该通道会被关闭。
  • Err:返回Context为何被取消。
  • Value:返回与Context相关的值,这些值必须是线程安全的。

Go语言的context包提供了两个函数用于创建Context对象:context.Background()context.TODO(),前者通常用在主函数、初始化以及测试代码中,表示一个空的Context,后者通常用在不确定应该使用什么Context,或者函数以后会更新以便接受一个Context参数。

此外,context包还提供了WithCancelWithDeadlineWithTimeoutWithValue函数,从现有的Context派生出新的Context

  • context.Background(): 返回一个空的Context,这个Context通常被用在main函数、初始化以及测试时。
  • context.TODO(): 当不确定应该使用什么Context,或者还未决定如何传递Context时,可以使用这个。
  • context.WithCancel(parent Context) (ctx Context, cancel CancelFunc): 根据已有的Context创建一个新的可取消的Context。
  • context.WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc): 根据已有的Context和设置的截止时间创建一个新的Context。
  • context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc): 基于已有的Context和指定的超时时间创建一个新的Context。
使用场景:
  1. 超时控制:我们可以通过context.WithTimeout创建一个超时的Context,当超时时间到达,该Context就会自动取消。比如,在数据库操作或外部服务调用时,可以通过设置超时的context来防止系统因为某个部分的响应缓慢而整体性能下降。
  2. 请求传递:在微服务或者并发编程的环境中,我们可以通过context.WithValue将请求相关的数据绑定到Context中,在函数调用链路上下游之间传递。
  3. 请求取消:我们可以通过Context.WithCancelcontext.WithTimeout创建一个可被取消的Context,并在需要取消的时候调用Contextcancel函数。比如在Web服务器中,如果客户端中断了请求,服务器可以通过context来取消所有相关的goroutine,从而避免资源浪费。
  4. 优雅地处理goroutine的生命周期: 通过contextDone通道,可以监听到取消信号,从而在goroutine中适时地释放资源,停止执行,保证程序的健売性和响应性。
package main

import (
	"context"
	"time"
)

func calculate(ctx context.Context, ch chan []int) {
	for {
		select {
		case data := <-ch:
			// 模拟一些处理过程
			process(data)
		case <-ctx.Done():
			// 如果context收到取消信号(超时或显式取消),则停止操作
			return
		}
	}
}

func process(data []int) {
	// 实际处理数据的函数
}

func ContextCase() {
	ctx := context.Background() // 创建一个背景context
	ctx = context.WithValue(ctx, "desc", "ContextCase") // 向context中添加键值对,这里添加描述信息"ContextCase"

	// 创建一个带有超时的context,超时时间为2秒
	ctx, cancel := context.WithTimeout(ctx, time.Second*2)
	defer cancel() // 确保在函数结束时取消context,以释放相关资源

	data := [][]int{ // 初始化数据
		{1, 2},
		{3, 2},
	}
	ch := make(chan []int) // 创建一个传递数据的channel
	go calculate(ctx, ch) // 启动一个goroutine来处理从channel接收的数据
	for i := 0; i < len(data); i++ {
		ch <- data[i] // 向channel发送数据
	}

	time.Sleep(time.Second * 10) // 主goroutine睡眠10秒
}

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数&#xff08;小数&#xff09;float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释&#xff08;或者多行注释&#xff09; …

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09; 文章目录 Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09;前言一、垂直鉴权是什么&#xff1f;二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…

【LLM 论文】Chain-of-Verification:通过验证链来减少 LLM 幻觉

论文&#xff1a;Chain-of-Verification Reduces Hallucination in Large Language Models ⭐⭐⭐ arXiv:2309.11495 论文速读 LLM 由于不可避免地会产生幻觉&#xff0c;现有的研究主要鼓励 LLM 在产生 response 之前生成内部思想的推理链&#xff0c;或者通过 self-critique…

使用leafletjs实现地图洋流、风场气象6要素地图标注、等值面图

前期实现的功能由于数据失效无法显示效果&#xff0c;今天重新对接一个数据源进行展示&#xff0c;实现效果如下图&#xff1a; 访问地址&#xff1a;可视化三维 GIS 特效 - 沉浸式视觉体验呈现令人惊叹的三维 GIS 特效&#xff0c;提供沉浸式视觉体验。https://www.wheart.cn/…

HTTP有哪些失败原因?怎么处理?

在我们日常的网络活动中&#xff0c;http协议是不可或缺的&#xff0c;它负责在互联网上传输数据。然而&#xff0c;在使用HTTP协议进行数据传输时&#xff0c;我们可能会遇到一些失败的情况。这些失败的原因多种多样&#xff0c;包括但不限于服务器问题、网络问题、客户端问题…

RobbitMQ基本消息队列的消息发送过程

RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址&#xff1a;Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…

Agent AI智能体的未来:无限可能

文章目录 终结者智能体正反影响自我意识开放心态 终结者 还记得那场人类与天网之间的史诗般的战斗吗&#xff1f;-- 《终结者》系列电影。 《终结者》系列电影是一部标志性的科幻动作系列&#xff0c;以紧张刺激的情节、令人难忘的角色和开创性的视觉效果而闻名。 电影探讨了…

中国地形可调节高度-UE5-UE4

2000坐标系&#xff0c;可进行高度调整。 支持版本4.21-5.4版本 下载位置&#xff1a;https://mbd.pub/o/bread/ZpWZm5Zs

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…

rbac权限和多级请假设计的流程演示和前端页面实现

登录账号&#xff1a;t6普通用户 t7部门经理 m8总经理 密码都为&#xff1a;test 多级请假&#xff1a;7级及以下申请请假需要部门经理审核&#xff0c;若是请假时长超过72小时&#xff0c;则需要总经理审核&#xff0c;7级申请请将需要总经理审核&#xff0c;总经理请假自动审…

kubernetes删除命名空间下所有资源

kubernetes强制删除命名空间下所有资源 在 Kubernetes 中&#xff0c;当一个命名空间处于 Terminating 状态但不会完成删除过程时&#xff0c;通常是因为内部资源没有被正确清理。要强制删除这个命名空间及其所有资源&#xff0c;你可以采取以下步骤&#xff1a; 1. 确认命名空…

Linux应用(四)——系统IO函数

本节学习linux系统中常见的IO函数&#xff0c;讲解及其基本用法&#xff1b; 一、 open/close函数 open函数作用:系统调用open函数&#xff0c;打开指定路径的文件&#xff1b; int open(const char *pathname, int flags&#xff09;&#xff1b;打开一个存在的文件&#xff1…

OpenNJet,够轻更强云原生应用引擎

前言&#xff1a; 在正式介绍OpenNJet之前&#xff0c;我们先来看看它的技术架构&#xff0c;如下图所示&#xff0c;OpenNJet正是NGINX的Pro版&#xff0c;在100%兼容NGINX基础上&#xff0c;新增了动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。 NGIN…

第十一讲:指针(3)

第十一讲&#xff1a;指针&#xff08;3&#xff09; 1.字符指针变量1.1存储一个字符1.2存储一个字符串1.3一个有趣的面试题 2.数组指针变量2.1什么是数组指针变量2.2数组指针变量的初始化 3.二维数组传参的本质4.函数指针变量4.1介绍函数指针变量4.2 两段有趣的代码4.2.1代码1…

华为 Huawei 交换机 配置 Dot1q 终结子接口实现同设备 VLAN 间通信示例

组网需求 企业的不同部门拥有相同的业务&#xff0c;如上网、 VoIP 等业务&#xff0c;且各个部门中的用户位于不同的网段。目前存在不同的部门中相同的业务所属的VLAN 不相同&#xff0c;现需要实现不同VLAN中的用户相互通信。 如 图 7-7 所示&#xff0c;部门 1 和部门 2 中…

机器学习的一些知识点分享

下面数据集中&#xff0c;第2个样本的第4个属性的值是&#xff08; &#xff09;。 A 52 B 男 C 50 D 49 本题得分&#xff1a; 2分 正确答案&#xff1a; D 2.单选题 (2分) 10-折交叉验证是把数据集分成&#xff08; &#xff09;个子集&#xff0c;将其中&#xff…

好景盒式磁带随声听

少年时代柜子里翻出来的磁带录音机电路板 两颗芯片&#xff0c;FM芯片&#xff0c;电机驱动 CD9088CBD6650

第十三届蓝桥杯决赛(国赛)真题 Java C 组【原卷】

文章目录 发现宝藏试题 A: 斐波那契与 7试题 B: 小蓝做实验试题 C: 取模试题 D: 内存空间试题 E \mathrm{E} E : 斐波那契数组试题 F: 最大公约数试题 G: 交通信号试题 I: 打折试题 J: 宝石收集 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络&#xff08;名称随便一个&#xff09; 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关&#xff0c;等下要用&#xff1b; 5.打开虚拟机&#xff0c;右上角&#xff0c;下标点…
最新文章