了解golang context包

context 包是 Go 标准库中的一个关键包,用于管理和传递请求范围的数据、控制并发、以及处理取消请求。它通常用于在不同的 Goroutine 之间传递请求范围的数据,以及在需要时取消某些操作。
以下是 context 包的主要功能和用法解读:
      1.背景 (Background):context.Background() 返回一个空的 context.Context,通常作为整个请求链的根。
      2.取消 (Cancellation):context 包提供了一种机制来取消正在进行的操作。当一个请求需要取消时,可以创建一个带有取消信号的 context,并将其传递给相关的 Goroutine。当取消信号触发时,相关的 Goroutine 可以优雅地停止工作。
ctx, cancel := context.WithCancel(context.Background())
go doSomething(ctx)
// 后续取消操作
cancel()
      3.超时 (Timeout):context.WithTimeoutcontext.WithDeadline 允许您在一段时间内自动取消操作,以避免长时间等待。
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() // 确保在函数返回时取消
go doSomething(ctx)
      4.值传递 (Value Passing):context 包允许您将请求范围的值传递给 Goroutine。这些值可以是任何类型,通常用于传递请求 ID、用户信息等。
ctx := context.WithValue(context.Background(), key, value)
       5.多层次的 Context:您可以通过在一个 context 的基础上创建新的 context 来建立多层次的 context。每个新的 context 可能会有不同的取消信号,但可以访问到父 context 中的值。
parentCtx, cancel := context.WithCancel(context.Background())
childCtx, _ := context.WithTimeout(parentCtx, 10*time.Second)
       6.在 Goroutine 中使用 Context:当在 Goroutine 中使用 context 时,通常会传递 context 到 Goroutine 的参数中,然后在 Goroutine 中检查 context 是否被取消或者是否有超时。
func doSomething(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // 收到取消信号或者超时信号,停止操作
            return
        default:
            // 继续执行操作
        }
    }
}
      7.传播 Context:在调用其他函数时,可以将当前的 context 传递给它们,以确保它们能够访问到相同的取消信号和值
func someFunction(ctx context.Context) {
    // 在此函数中使用 ctx
}
   小结:context 包是 Go 中处理请求范围数据传递、取消操作和超时处理的强大工具。它有助于编写可靠且可维护的并发代码,确保在多个 Goroutine 之间有效地管理请求。要有效使用 context 包,请确保在整个应用程序中一致地传递和检查 context,以便处理取消和超时情况。
posted @ 2023-09-03 14:13  美好生活我心往之  阅读(16)  评论(0编辑  收藏  举报