美文网首页
Go语言中的Context

Go语言中的Context

作者: 付凯强 | 来源:发表于2023-12-17 17:59 被阅读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编译系统。

    相关文章

      网友评论

          本文标题:Go语言中的Context

          本文链接:https://www.haomeiwen.com/subject/hwrxwdtx.html