Go语言中的Context

2023-12-17  本文已影响0人  付凯强

在Go语言中,Context是一个用于跟踪请求的上下文对象。它可以在多个Goroutine之间传递请求相关的信息,如请求的截止时间、请求的元数据等。Context可以帮助我们优雅地处理并发请求,避免资源泄漏和无限等待的情况。

在理解Context之前,我们需要先了解Goroutine和Channel的概念。Goroutine是Go语言中的轻量级线程,可以并发执行函数或方法。Channel是Goroutine之间进行通信的管道,用于传递数据。

Context的主要作用是传递请求的上下文信息,并在多个Goroutine之间进行传递。它可以用于控制Goroutine的生命周期、传递请求的截止时间、传递请求的元数据等。

使用Context的一般步骤如下:

  1. 创建一个根Context,通常使用context.Background()函数创建。
  2. 根据需要,使用context.WithCancel()context.WithDeadline()context.WithTimeout()函数创建一个派生的Context,用于控制Goroutine的生命周期或设置请求的截止时间。
  3. 将Context传递给需要使用的Goroutine,可以通过函数参数或Channel进行传递。
  4. 在Goroutine中,使用ctx.Done()通道来接收Context的取消信号,以便在合适的时机退出Goroutine。
  5. 在Goroutine中,可以使用ctx.Value()函数获取Context中存储的请求的元数据。

下面是一个简单的示例代码,演示了如何使用Context:

package main

import (
    "context"
    "fmt"
    "time"
)

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Worker received cancellation signal")
            return
        default:
            fmt.Println("Worker is processing")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ctx := context.Background() // 创建一个非nil的空context
    ctx, cancel := context.WithCancel(ctx) //context 注册一个取消的信号

    go worker(ctx) //Goroutine中携带这个context

    time.Sleep(3 * time.Second)
    cancel() //执行取消信号,注册的地方就可以收到

    time.Sleep(2 * time.Second)
    fmt.Println("Main goroutine exited")
}

在上面的示例中,我们创建了一个根Context,并使用context.WithCancel()函数创建了一个派生的Context。然后,我们将这个Context传递给了一个Goroutine中的worker函数。在worker函数中,我们使用ctx.Done()通道来接收Context的取消信号,并在接收到取消信号时退出Goroutine。在主函数中,我们等待一段时间后调用cancel()函数来取消Context,从而触发worker函数中的退出逻辑。

Worker is processing
Worker is processing
Worker is processing
Worker received cancellation signal
Main goroutine exited

以上信息来自C知道,记录学习下,便于更好的理解Android soong编译系统。

上一篇 下一篇

猜你喜欢

热点阅读