go语言的context
创始人
2024-09-25 13:47:32
0

Go 语言中的`context`(上下文)是一个用于在 goroutine 之间传递上下文信息的包,它包含了 goroutine 的运行状态、环境、现场等相关信息。

`context`主要有以下作用:
1. 传递取消信号:可以在一组相关的 goroutine 中传播取消操作,以便及时终止不再需要的协程执行,避免资源浪费。
2. 管理超时时间:设置操作的截止时间,当超过这个时间后,可以采取相应的措施,例如返回默认值或错误。
3. 传递元数据:例如共享请求的基本数据,如登录令牌等。

在 Go 语言中,服务器通常会为每个请求启动多个 goroutine 来处理不同的任务这些 goroutine 之间可能需要共享一些信息并且能够同时被关闭。使用`context`可以方便地实现这些功能,而无需使用复杂的`channel + select`方式来控制协程的关闭。

`context`是一个接口,定义了几个方法,其中重要的方法包括:
- `done()`:返回一个只读的通道(`<-chan struct{}`)。当该通道被关闭时,表示`context`被取消。子协程通过读取这个通道,可得知`context`是否已被取消,从而进行相应的收尾工作并尽快退出。
- `err()`:返回一个错误,表示通道被关闭的原因,例如是被取消还是超时。
- `deadline()`:返回`context`的截止时间,函数可以根据这个时间来决定是否进行接下来的操作。
- `value(key interface{})`:获取之前设置的与指定键对应的`value`。

通过使用`context`包提供的函数,可以创建不同类型的`context`对象,例如:
- `context.Background()`:创建一个空的根`context`,通常在整个程序的顶层使用。
- `context.TODO()`:用于在不知道使用什么`context`时,或者在重构阶段暂时使用。
- `context.WithCancel(parent Context)`:基于父`context`创建一个可取消的子`context`。
- `context.WithDeadline(parent Context, deadline time.Time)`:创建一个带有截止时间的`context`。
- `context.WithTimeout(parent Context, timeout time.Duration)`:创建一个设置了超时时间的`context`。
- `context.WithValue(parent Context, key, value interface{})`:创建一个可以存储键值对的`context`。

使用`context`可以使代码更加简洁、清晰,并且便于管理和控制协程的执行,特别是在处理并发、超时和取消等复杂场景时,能够有效地提高程序的可靠性和可维护性。同时,`context`的设计保证了在多个 goroutine 中使用时的并发安全性。例如,创建一个带有超时时间的`context`并在协程中使用的示例代码如下:

package main  import (     "context"     "fmt"     "time" )  func main() {     // 创建一个带有 5 秒超时的 context     ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)     defer cancel()       // 使用带有超时的 context 启动一个协程     go doSomething(ctx)       // 模拟其他操作     time.Sleep(3 * time.Second)  }  func doSomething(ctx context.Context) {     for {         select {         case <-ctx.Done():              fmt.Println("任务超时或被取消")             return         default:             fmt.Println("执行任务中...")             time.Sleep(1 * time.Second)          }     } } 

在上述代码中,`doSomething`协程会一直执行任务,直到`ctx.Done()`通道有值可读,即超时时间到达或被手动取消。在`main`函数中,通过`context.WithTimeout`创建了一个超时时间为 5 秒的`context`,并在 3 秒后模拟了其他操作。如果协程在 5 秒内没有完成任务,就会打印"任务超时或被取消"并退出。

使用`context`时,需注意正确传递和处理`context`对象,避免出现未传递`context`导致无法取消协程、误用不可取消的`context`等问题。同时,在使用`done`通道时,要在适当的地方进行监听和处理,以确保任务能够及时响应取消信号。

相关内容

热门资讯

3分钟方案!越乡游辅助器下载免... 3分钟方案!越乡游辅助器下载免费,皇豪互娱控制系统(辅助)一直是有辅助器(哔哩哔哩)1、下载好越乡游...
八分钟模块!越乡游辅助器,新众... 八分钟模块!越乡游辅助器,新众亿辅助(辅助)果然是真的工具(哔哩哔哩)该软件可以轻松地帮助玩家将越乡...
第2分钟秘籍!逍遥辅助器手机版... 第2分钟秘籍!逍遥辅助器手机版,新九哥辅助开挂(辅助)一直存在有工具(哔哩哔哩)1、逍遥辅助器手机版...
三分钟方针!指尖四川小程序破解... 三分钟方针!指尖四川小程序破解器,新二号透视辅助(辅助)果然真的是有修改器(哔哩哔哩)1、任何指尖四...
十分钟绝活儿!欢乐游戏城攻略,... 十分钟绝活儿!欢乐游戏城攻略,新九天辅助器(辅助)一直有挂辅助器(哔哩哔哩)欢乐游戏城攻略是不是有人...
一分钟步骤!新上游通用挂是真的... 一分钟步骤!新上游通用挂是真的吗,新漫游正版辅助软件(辅助)本来真的有辅助器(哔哩哔哩)亲,关键说明...
第二分钟资料!越乡游辅助脚本,... 第二分钟资料!越乡游辅助脚本,新西游游戏辅助(辅助)总是有挂辅助器(哔哩哔哩)亲,关键说明,越乡游辅...
第七分钟窍门!天天贵阳大瓮安插... 第七分钟窍门!天天贵阳大瓮安插件,火神微信辅助(辅助)原来是真的辅助器(哔哩哔哩)1、玩家可以在天天...
四分钟经验!大唐麻将辅助软件,... 四分钟经验!大唐麻将辅助软件,小程序财神十三张脚本(辅助)真是存在有修改器(哔哩哔哩)1、进入游戏-...
第1分钟诀窍!微信小程序游戏破... 第1分钟诀窍!微信小程序游戏破解器,卡农血拼辅助(辅助)真是是有插件(哔哩哔哩)1、每一步都需要思考...