Go-Context

介绍

在 Go 语言中,`context` 是一个用于在不同 Goroutine 之间传递请求范围数据、控制请求生命周期和处理取消信号的工具。它提供了一种机制来管理 Goroutine 之间的上下文信息,并允许在请求处理链中传递和取消上下文。

`context` 的主要优点和用途包括

1. 请求范围数据传递:`context` 允许在请求处理链中传递请求相关的数据,如请求 ID、用户身份验证信息等。这样可以避免在函数参数中传递大量的上下文信息。

2. 控制请求生命周期:`context` 允许设置超时时间、截止时间和取消信号,用于控制请求的处理时间和生命周期。当超时或取消信号触发时,相关的 Goroutine 可以及时退出,避免资源泄漏。

3. 处理取消信号:`context` 提供了一个取消机制,可以通过调用 `context` 的 `cancel` 方法来发送取消信号,通知相关的 Goroutine 停止处理请求。这对于处理长时间运行的请求或需要提前终止的情况非常有用。

应用场景

常见的 `context` 用法和应用场景包括

1.在 HTTP 服务器中使用`context` 传递请求相关的数据和控制请求的生命周期,如超时控制、请求取消等。

2.在并发任务中使用`context` 传递上下文信息和取消信号,以便在需要时中止任务的执行。- 在微服务架构中,使用 `context` 在服务之间传递请求范围的数据和控制请求的生命周期。

3.在测试中使用`context` 控制测试的超时时间和取消信号,以确保测试的稳定性和可靠性。通过使用 `context`,可以更好地管理和控制 Goroutine 之间的上下文信息和请求在日志记录中,使用 context 传递请求相关的数据,如请求 ID、用户信息等,以便在日志中记录相关的上下文信息。

4.在数据库操作中使用`context` 控制数据库查询的超时时间和取消信号,以避免长时间的阻塞和资源浪费

5.在调用远程服务或 API 时使`context `控制请求的超时时间和取消信号,以确保及时处理超时或取消的情况。

6.在任务调度和并发控制中使用 `context` 传递任务相关的数据和控制任务的生命周期,如任务取消、任务超时等。

Context,中文叫做上下文,Go语言在1.7版本中新增的context包中定义了ContextContext本质是一个接口,这个接口一共定义了四个方法:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}
  • Dateline():获取定时关闭的时间。
  • Done():从一个channel获取关闭的信号
  • Err():获取错误信息。
  • Value():根据keyContext取值

Demo

context是一个接口,这意味着需要有具体的实现。用户可以按照接口中定义的方法,严格实现其语义。当然,一般用得最多的还是Go标准库的简单实现。

调用context.Background函数或context.TODO函数会返回最简单的context实现。

TODO

 

posted @ 2023-07-05 05:26  GJH-  阅读(28)  评论(0编辑  收藏  举报