美文网首页
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编译系统。

相关文章

  • TODO:Go语言goroutine和channel使用

    TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语...

  • Go语言指针

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。 接下来让我们来一步步学习 Go 语...

  • Go的内存管理

    本文翻译自Memory Management in Go,介绍了Go语言中内存管理的相关概念。 所有的计算机程序语...

  • GO 语言context.Context类型

    context.Context类型 context.Context类型(以下简称Context类型)是在Go 1....

  • Go Context介绍

    context包是Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体,是开发常用的并发控制技术。与Wa...

  • Golang Context 详细原理和使用技巧

    Golang Context 详细原理和使用技巧 Context 背景 和 适用场景 Context 的背景 Go...

  • go context

    Req-->a-->c--->b---->return (链式调用) 链式调用和我们普通的函数调用是存在差别的:函...

  • Go context

    goroutine要处理的问题? 数据共享 释放回收 github练习代码 context doc blog...

  • Go context

    Go context 在RPC或者Web服务中,当Server端接受一个request的时候,都会开启一个额外的g...

  • Go context

    控制并发有两种经典的方式:WaitGroup和Context WaitGroup:控制多个Goroutine同时完...

网友评论

      本文标题:Go语言中的Context

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