Go语言中context原理及使用

ops/2024/11/14 13:01:41/

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 mainimport ("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() // 创建一个背景contextctx = 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) // 创建一个传递数据的channelgo 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.ppmy.cn/ops/40743.html

相关文章

【Linux】yum与vim

文章目录 软件包管理器&#xff1a;yumLinux安装和卸载软件包Linux中的编辑器&#xff1a;vimvim下的底行模式vim下的正常模式vim下的替换模式vim下的视图模式vim下的多线程 软件包管理器&#xff1a;yum yum其实就是一个软件,也可以叫商店 和你手机上的应用商店或app store一…

特殊类的设计与单例模式

1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类&#xff1f;将类的默认构造函数设置为私有&#xff0c;再将类的拷贝构造函数设置为delete&#xff0c;设置静态函数GetObj&#xff0c;内部调用new HeapOnly&#xff0c;这样就只能在堆上开辟空间。 class HeapOnly…

算法训练Day28 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II class Solution { public:int maxProfit(vector<int>& prices) {vector<int> dp(2,0);dp[0] -prices[0];for(int i1; i<prices.size(); i){dp[0] max(dp[0], dp[1]-prices[i]);dp[1] max(dp[1], prices[i]dp[0]);}return dp[1]…

EdgeOne 免费证书快速实现网站 HTTPS 访问

在当今互联网环境下&#xff0c;HTTPS访问已经成为现代网站的必备功能。HTTPS 访问不仅能够更有效地保障用户在访问到网站时的数据安全传输&#xff0c;防止信息泄露、消息劫持等问题&#xff0c;在搜索引擎中&#xff0c;未实现 HTTPS 还会被浏览器提示为不安全网站&#xff0…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…

SpringCloud 集成 RocketMQ 及配置解析

文章目录 前言一、SpringCloud 集成 RocketMQ1. pom 依赖2. yml 配置3. 操作实体4. 生产消息4.1. 自动发送消息4.2. 手动发送消息 5. 消费消息 二、配置解析1. spring.cloud.stream.function.definition 前言 定义 Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力…

TCP及IP协议

TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” TCP传输可靠性———确认&#xff0c;重传&#xff0c;排序&#xff0c;流控。 流控&#xff1a;滑动窗口机制 TTL--- 数据包每经过一个路由器的转发&#xff0c;他的TTL值将减1&#xff0c;当一个数据包中的T…

Android 右键 new AIDL 无法选择

提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file&#xff09; 解决方式&#xff1a; 在app的build.gradl中 adnroid{} 添加&#xff1a; buildFeatures{aidl true}